blob: 06602f7bccf3e5285a07448e7d852a037215a19f [file] [log] [blame]
Neels Hofmeyra99b4272017-11-21 17:13:23 +01001/* Osmocom MSC+VLR end-to-end tests */
2
3/* (C) 2017 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
4 *
5 * All Rights Reserved
6 *
7 * Author: Neels Hofmeyr <nhofmeyr@sysmocom.de>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU Affero General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU Affero General Public License for more details.
18 *
19 * You should have received a copy of the GNU Affero General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 *
22 */
23
24#include "msc_vlr_tests.h"
25
26#include <osmocom/msc/gsm_04_08.h>
27
Neels Hofmeyr07351d82019-10-21 05:53:58 +020028#define mncc_sends_to_cc(MSG_TYPE, MNCC) do { \
29 (MNCC)->msg_type = MSG_TYPE; \
30 log("MSC <-- MNCC: callref 0x%x: %s\n%s", (MNCC)->callref, \
31 get_mncc_name((MNCC)->msg_type), \
32 (MNCC)->sdp); \
33 mncc_tx_to_cc(net, MNCC); \
34 } while(0)
Neels Hofmeyra99b4272017-11-21 17:13:23 +010035
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010036/*
Neels Hofmeyrcbcf89c2018-03-13 17:52:07 +010037static void on_call_release_mncc_sends_to_cc(uint32_t msg_type, struct gsm_mncc *mncc)
38{
39 mncc->msg_type = msg_type;
40 on_call_release_mncc_sends_to_cc_data = mncc;
41}
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010042*/
Neels Hofmeyrcbcf89c2018-03-13 17:52:07 +010043
Neels Hofmeyra99b4272017-11-21 17:13:23 +010044#define IMSI "901700000010650"
45
Neels Hofmeyr11bf0bc2019-10-21 05:55:49 +020046static void lu_utran_tmsi()
Neels Hofmeyra99b4272017-11-21 17:13:23 +010047{
48 struct vlr_subscr *vsub;
49
50 net->authentication_required = true;
51 net->vlr->cfg.assign_tmsi = true;
Neels Hofmeyr7814a832018-12-26 00:40:18 +010052 rx_from_ran = OSMO_RAT_UTRAN_IU;
Neels Hofmeyra99b4272017-11-21 17:13:23 +010053
54 btw("Location Update request causes a GSUP Send Auth Info request to HLR");
55 lu_result_sent = RES_NONE;
Neels Hofmeyr63b24642019-12-12 01:31:04 +010056 gsup_expect_tx("080108" "09710000000156f0" CN_DOMAIN VLR_TO_HLR);
Neels Hofmeyra99b4272017-11-21 17:13:23 +010057 ms_sends_msg("0508" /* MM LU */
58 "7" /* ciph key seq: no key available */
59 "0" /* LU type: normal */
60 "09f107" "0017" /* LAI, LAC */
61 "57" /* classmark 1: R99, early classmark, no power lvl */
62 "089910070000106005" /* IMSI */
63 "3303575886" /* classmark 2 */
64 );
65 OSMO_ASSERT(gsup_tx_confirmed);
66 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
67
68 btw("from HLR, rx _SEND_AUTH_INFO_RESULT; VLR sends Auth Req to MS");
69 /* based on auc_3g:
70 * K = 'EB215756028D60E3275E613320AEC880',
71 * OPC = 'FB2A3D1B360F599ABAB99DB8669F8308'
72 * SQN = 0
73 */
74 auth_request_sent = false;
75 auth_request_expect_rand = "39fa2f4e3d523d8619a73b4f65c3e14d";
76 auth_request_expect_autn = "8704f5ba55f30000d2ee44b22c8ea919";
77 gsup_rx("0a"
78 /* imsi */
79 "0108" "09710000000156f0"
80 /* 5 auth vectors... */
81 /* TL TL rand */
82 "0362" "2010" "39fa2f4e3d523d8619a73b4f65c3e14d"
83 /* TL sres TL kc */
84 "2104" "9b36efdf" "2208" "059a4f668f6fbe39"
85 /* TL 3G IK */
86 "2310" "27497388b6cb044648f396aa155b95ef"
87 /* TL 3G CK */
88 "2410" "f64735036e5871319c679f4742a75ea1"
89 /* TL AUTN */
90 "2510" "8704f5ba55f30000d2ee44b22c8ea919"
91 /* TL RES */
92 "2708" "e229c19e791f2e41"
93 /* TL TL rand */
94 "0362" "2010" "c187a53a5e6b9d573cac7c74451fd46d"
95 "2104" "85aa3130" "2208" "d3d50a000bf04f6e"
96 "2310" "1159ec926a50e98c034a6b7d7c9f418d"
97 "2410" "df3a03d9ca5335641efc8e36d76cd20b"
98 "2510" "1843a645b98d00005b2d666af46c45d9"
99 "2708" "7db47cf7f81e4dc7"
100 "0362" "2010" "efa9c29a9742148d5c9070348716e1bb"
101 "2104" "69d5f9fb" "2208" "3df176f0c29f1a3d"
102 "2310" "eb50e770ddcc3060101d2f43b6c2b884"
103 "2410" "76542abce5ff9345b0e8947f4c6e019c"
104 "2510" "f9375e6d41e1000096e7fe4ff1c27e39"
105 "2708" "706f996719ba609c"
106 "0362" "2010" "f023d5a3b24726e0631b64b3840f8253"
107 "2104" "d570c03f" "2208" "ec011be8919883d6"
108 "2310" "c4e58af4ba43f3bcd904e16984f086d7"
109 "2410" "0593f65e752e5cb7f473862bda05aa0a"
110 "2510" "541ff1f077270000c5ea00d658bc7e9a"
111 "2708" "3fd26072eaa2a04d"
112 "0362" "2010" "2f8f90c780d6a9c0c53da7ac57b6707e"
113 "2104" "b072446f220823f39f9f425ad6e6"
114 "2310" "65af0527fda95b0dc5ae4aa515cdf32f"
115 "2410" "537c3b35a3b13b08d08eeb28098f45cc"
116 "2510" "4bf4e564f75300009bc796706bc65744"
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100117 "2708" "0edb0eadbea94ac2"
118 HLR_TO_VLR,
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100119 NULL);
120 VERBOSE_ASSERT(auth_request_sent, == true, "%d");
121 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
122
123 btw("MS sends Authen Response, VLR accepts and sends SecurityModeControl");
Neels Hofmeyrdbabfd32018-03-10 02:06:47 +0100124 expect_security_mode_ctrl(NULL, "27497388b6cb044648f396aa155b95ef");
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100125 ms_sends_msg("0554" "e229c19e" "2104" "791f2e41");
Neels Hofmeyrdbabfd32018-03-10 02:06:47 +0100126 VERBOSE_ASSERT(security_mode_ctrl_sent, == true, "%d");
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100127 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
128
129 btw("MS sends SecurityModeControl acceptance, VLR accepts and sends GSUP LU Req to HLR");
Neels Hofmeyr63b24642019-12-12 01:31:04 +0100130 gsup_expect_tx("04010809710000000156f0" CN_DOMAIN VLR_TO_HLR);
Alexander Couzens2aaff752021-10-19 17:09:11 +0200131 ms_sends_security_mode_complete(1);
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100132 VERBOSE_ASSERT(gsup_tx_confirmed, == true, "%d");
133 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
134
135 btw("HLR sends _INSERT_DATA_REQUEST, VLR responds with _INSERT_DATA_RESULT");
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100136 gsup_rx("10010809710000000156f00804032443f2" HLR_TO_VLR,
137 "12010809710000000156f0" VLR_TO_HLR);
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100138 VERBOSE_ASSERT(lu_result_sent, == RES_NONE, "%d");
139
140 btw("HLR also sends GSUP _UPDATE_LOCATION_RESULT");
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100141 gsup_rx("06010809710000000156f0" HLR_TO_VLR, NULL);
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100142
143 VERBOSE_ASSERT(lu_result_sent, == RES_ACCEPT, "%d");
144
145 btw("a LU Accept with a new TMSI was sent, waiting for TMSI Realloc Compl");
146 EXPECT_CONN_COUNT(1);
147 EXPECT_ACCEPTED(false);
148
149 btw("MS sends TMSI Realloc Complete");
150 iu_release_expected = true;
151 iu_release_sent = false;
152 ms_sends_msg("055b");
153 VERBOSE_ASSERT(iu_release_sent, == true, "%d"); \
154
155 btw("LU was successful, and the conn has already been closed");
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100156 ran_sends_clear_complete();
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100157 EXPECT_CONN_COUNT(0);
158
Neels Hofmeyr7c5346c2019-02-19 02:36:35 +0100159 vsub = vlr_subscr_find_by_imsi(net->vlr, IMSI, __func__);
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100160 VERBOSE_ASSERT(vsub != NULL, == true, "%d");
161 VERBOSE_ASSERT(strcmp(vsub->imsi, IMSI), == 0, "%d");
Max7d41d872018-12-19 11:48:33 +0100162 VAL_ASSERT("LAC", vsub->cgi.lai.lac, == 23, "%u");
Neels Hofmeyr7c5346c2019-02-19 02:36:35 +0100163 vlr_subscr_put(vsub, __func__);
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100164}
165
Neels Hofmeyrf3d81f62018-03-02 01:05:38 +0100166static void test_call_mo()
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100167{
168 struct gsm_mncc mncc = {
169 .imsi = IMSI,
170 };
171
Neels Hofmeyrdfdc61d2018-03-02 00:40:58 +0100172 comment_start();
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100173
174 fake_time_start();
175
Neels Hofmeyr11bf0bc2019-10-21 05:55:49 +0200176 lu_utran_tmsi();
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100177
178 BTW("after a while, a new conn sends a CM Service Request. VLR responds with Auth Req, 2nd auth vector");
179 auth_request_sent = false;
180 auth_request_expect_rand = "c187a53a5e6b9d573cac7c74451fd46d";
181 auth_request_expect_autn = "1843a645b98d00005b2d666af46c45d9";
182 cm_service_result_sent = RES_NONE;
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100183 ms_sends_msg("052471"
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100184 "03575886" /* classmark 2 */
185 "089910070000106005" /* IMSI */);
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100186 VERBOSE_ASSERT(cm_service_result_sent, == RES_NONE, "%d");
187 VERBOSE_ASSERT(auth_request_sent, == true, "%d");
188
189 btw("needs auth, not yet accepted");
190 EXPECT_ACCEPTED(false);
191
192 /* On UTRAN */
193 btw("MS sends Authen Response, VLR accepts and sends SecurityModeControl");
Neels Hofmeyrdbabfd32018-03-10 02:06:47 +0100194 expect_security_mode_ctrl(NULL, "1159ec926a50e98c034a6b7d7c9f418d");
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100195 ms_sends_msg("0554" "7db47cf7" "2104" "f81e4dc7"); /* 2nd vector's res, s.a. */
Neels Hofmeyrdbabfd32018-03-10 02:06:47 +0100196 VERBOSE_ASSERT(security_mode_ctrl_sent, == true, "%d");
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100197 VERBOSE_ASSERT(cm_service_result_sent, == RES_NONE, "%d");
198
199 btw("MS sends SecurityModeControl acceptance, VLR accepts; above Ciphering is an implicit CM Service Accept");
Alexander Couzens2aaff752021-10-19 17:09:11 +0200200 ms_sends_security_mode_complete(1);
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100201 VERBOSE_ASSERT(cm_service_result_sent, == RES_NONE, "%d");
202
203 BTW("a call is initiated");
204
205 btw("SETUP gets forwarded to MNCC");
206 cc_to_mncc_expect_tx(IMSI, MNCC_SETUP_IND);
207 ms_sends_msg("0385" /* CC, seq = 2 -> 0x80 | CC Setup = 0x5 */
208 "0406600402000581" /* Bearer Capability */
209 "5e038121f3" /* Called Number BCD */
210 "15020100" /* CC Capabilities */
211 "4008" /* Supported Codec List */
212 "04026000" /* UMTS: AMR 2 | AMR */
213 "00021f00" /* GSM: HR AMR | FR AMR | GSM EFR | GSM HR | GSM FR */
214 );
215 OSMO_ASSERT(cc_to_mncc_tx_confirmed);
216 mncc.callref = cc_to_mncc_tx_got_callref;
217
Neels Hofmeyr3f391dd2019-08-29 03:53:11 +0200218 btw("MNCC replies with MNCC_RTP_CREATE, causing MGW endpoint CRCX to RAN");
219 expect_crcx(RTP_TO_RAN);
220 mncc_sends_to_cc(MNCC_RTP_CREATE, &mncc);
221 OSMO_ASSERT(got_crcx);
222
223 btw("MGW acknowledges the CRCX, triggering Assignment");
224 expect_iu_rab_assignment();
225 crcx_ok(RTP_TO_RAN);
226 OSMO_ASSERT(iu_rab_assignment_sent);
227
228 btw("Assignment succeeds, triggering CRCX to CN");
229 expect_crcx(RTP_TO_CN);
Neels Hofmeyrcec51b32023-03-01 03:47:45 +0100230 ms_sends_assignment_complete("AMR");
Neels Hofmeyr3f391dd2019-08-29 03:53:11 +0200231 OSMO_ASSERT(got_crcx);
232
233 btw("CN RTP address is available, trigger MNCC_RTP_CREATE");
234 cc_to_mncc_expect_tx("", MNCC_RTP_CREATE);
235 crcx_ok(RTP_TO_CN);
236
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100237 btw("MNCC says that's fine");
238 dtap_expect_tx("8302" /* CC: Call Proceeding */);
239 mncc_sends_to_cc(MNCC_CALL_PROC_REQ, &mncc);
240 OSMO_ASSERT(dtap_tx_confirmed);
241
242 fake_time_passes(1, 23);
243
244 btw("The other call leg got established (not shown here), MNCC tells us so");
245 dtap_expect_tx("8301" /* CC: Call Alerting */);
246 mncc_sends_to_cc(MNCC_ALERT_REQ, &mncc);
247 OSMO_ASSERT(dtap_tx_confirmed);
248
249 dtap_expect_tx("8307" /* CC: Connect */);
250 mncc_sends_to_cc(MNCC_SETUP_RSP, &mncc);
251 OSMO_ASSERT(dtap_tx_confirmed);
252
253 fake_time_passes(1, 23);
254
255 cc_to_mncc_expect_tx("", MNCC_SETUP_COMPL_IND);
256 ms_sends_msg("03cf" /* CC: Connect Acknowledge */);
257 OSMO_ASSERT(cc_to_mncc_tx_confirmed);
258
259 BTW("RTP stream goes ahead, not shown here.");
260 fake_time_passes(123, 45);
261
262 BTW("Call ends");
263 cc_to_mncc_expect_tx("", MNCC_DISC_IND);
264 ms_sends_msg("032502e090" /* CC: Disconnect, cause: Normal Call Clearing */);
265 OSMO_ASSERT(cc_to_mncc_tx_confirmed);
266
267 dtap_expect_tx("832d" /* CC: Release */);
268 mncc_sends_to_cc(MNCC_REL_REQ, &mncc);
269 OSMO_ASSERT(dtap_tx_confirmed);
270
271 cc_to_mncc_expect_tx("", MNCC_REL_CNF);
272 expect_iu_release();
273 ms_sends_msg("036a" /* CC: Release Complete */);
274 OSMO_ASSERT(cc_to_mncc_tx_confirmed);
275 OSMO_ASSERT(iu_release_sent);
276
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100277 ran_sends_clear_complete();
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100278 EXPECT_CONN_COUNT(0);
279 clear_vlr();
Neels Hofmeyrdfdc61d2018-03-02 00:40:58 +0100280 comment_end();
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100281}
282
Neels Hofmeyrf3d81f62018-03-02 01:05:38 +0100283static void test_call_mt()
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100284{
285 struct gsm_mncc mncc = {
286 .imsi = IMSI,
287 .callref = 0x423,
288 };
289
Neels Hofmeyrdfdc61d2018-03-02 00:40:58 +0100290 comment_start();
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100291
292 fake_time_start();
293
Neels Hofmeyr11bf0bc2019-10-21 05:55:49 +0200294 lu_utran_tmsi();
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100295
296 BTW("after a while, MNCC asks us to setup a call, causing Paging");
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100297
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100298 paging_expect_imsi(IMSI);
299 paging_sent = false;
300 mncc_sends_to_cc(MNCC_SETUP_REQ, &mncc);
301
302 VERBOSE_ASSERT(paging_sent, == true, "%d");
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100303
304 btw("MS replies with Paging Response, and VLR sends Auth Request");
305 auth_request_sent = false;
306 auth_request_expect_rand = "c187a53a5e6b9d573cac7c74451fd46d";
307 auth_request_expect_autn = "1843a645b98d00005b2d666af46c45d9";
308 ms_sends_msg("062707"
309 "03575886" /* classmark 2 */
310 "089910070000106005" /* IMSI */);
311 VERBOSE_ASSERT(auth_request_sent, == true, "%d");
312
313 btw("MS sends Authen Response, VLR accepts and sends SecurityModeControl");
Neels Hofmeyrdbabfd32018-03-10 02:06:47 +0100314 expect_security_mode_ctrl(NULL, "1159ec926a50e98c034a6b7d7c9f418d");
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100315 ms_sends_msg("0554" "7db47cf7" "2104" "f81e4dc7"); /* 2nd vector's res, s.a. */
Neels Hofmeyrdbabfd32018-03-10 02:06:47 +0100316 VERBOSE_ASSERT(security_mode_ctrl_sent, == true, "%d");
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100317
318 btw("MS sends SecurityModeControl acceptance, VLR accepts, sends CC Setup");
319 dtap_expect_tx("0305" /* CC: Setup */);
Alexander Couzens2aaff752021-10-19 17:09:11 +0200320 ms_sends_security_mode_complete(1);
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100321
Neels Hofmeyr3f391dd2019-08-29 03:53:11 +0200322 btw("MS confirms call, we create a RAN-side RTP and forward MNCC_CALL_CONF_IND");
323 expect_crcx(RTP_TO_RAN);
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100324 cc_to_mncc_expect_tx(IMSI, MNCC_CALL_CONF_IND);
325 ms_sends_msg("8348" /* CC: Call Confirmed */
326 "0406600402000581" /* Bearer Capability */
327 "15020100" /* Call Control Capabilities */
328 "40080402600400021f00" /* Supported Codec List */);
Neels Hofmeyr3f391dd2019-08-29 03:53:11 +0200329 OSMO_ASSERT(got_crcx);
330 OSMO_ASSERT(cc_to_mncc_tx_confirmed);
331
332 btw("MNCC sends MNCC_RTP_CREATE");
333 mncc_sends_to_cc(MNCC_RTP_CREATE, &mncc);
334
335 btw("MGW acknowledges the CRCX to RAN, triggering Assignment");
336 expect_iu_rab_assignment();
337 crcx_ok(RTP_TO_RAN);
338 OSMO_ASSERT(iu_rab_assignment_sent);
339
340 btw("Assignment completes, triggering CRCX to CN");
341 expect_crcx(RTP_TO_CN);
Neels Hofmeyrcec51b32023-03-01 03:47:45 +0100342 ms_sends_assignment_complete("AMR");
Neels Hofmeyr3f391dd2019-08-29 03:53:11 +0200343 OSMO_ASSERT(got_crcx);
344
345 btw("When the CN side RTP address is known, send MNCC_RTP_CREATE");
346 cc_to_mncc_expect_tx("", MNCC_RTP_CREATE);
347 crcx_ok(RTP_TO_CN);
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100348
349 fake_time_passes(1, 23);
350
351 cc_to_mncc_expect_tx("", MNCC_ALERT_IND);
352 ms_sends_msg("8381" /* CC: Alerting */);
353
354 fake_time_passes(1, 23);
355
356 cc_to_mncc_expect_tx(IMSI, MNCC_SETUP_CNF);
357 ms_sends_msg("83c7" /* CC: Connect */);
358
359 dtap_expect_tx("030f" /* CC: Connect Acknowledge */);
360 mncc_sends_to_cc(MNCC_SETUP_COMPL_REQ, &mncc);
361
362 BTW("RTP stream goes ahead, not shown here.");
363 fake_time_passes(123, 45);
364
365 BTW("Call ends");
366 cc_to_mncc_expect_tx("", MNCC_DISC_IND);
367 ms_sends_msg("832502e090" /* CC: Disconnect, cause: Normal Call Clearing */);
368 OSMO_ASSERT(cc_to_mncc_tx_confirmed);
369
370 dtap_expect_tx("032d" /* CC: Release */);
371 mncc_sends_to_cc(MNCC_REL_REQ, &mncc);
372 OSMO_ASSERT(dtap_tx_confirmed);
373
374 cc_to_mncc_expect_tx("", MNCC_REL_CNF);
375 expect_iu_release();
376 ms_sends_msg("836a" /* CC: Release Complete */);
377 OSMO_ASSERT(cc_to_mncc_tx_confirmed);
378 OSMO_ASSERT(iu_release_sent);
379
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100380 ran_sends_clear_complete();
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100381 EXPECT_CONN_COUNT(0);
382 clear_vlr();
Neels Hofmeyrdfdc61d2018-03-02 00:40:58 +0100383 comment_end();
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100384}
385
Neels Hofmeyrcbcf89c2018-03-13 17:52:07 +0100386static void test_call_mt2()
387{
388 struct gsm_mncc mncc = {
389 .imsi = IMSI,
390 .callref = 0x423,
391 };
392
393 comment_start();
394
395 fake_time_start();
396
Neels Hofmeyr11bf0bc2019-10-21 05:55:49 +0200397 lu_utran_tmsi();
Neels Hofmeyrcbcf89c2018-03-13 17:52:07 +0100398
399 BTW("after a while, MNCC asks us to setup a call, causing Paging");
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100400
Neels Hofmeyrcbcf89c2018-03-13 17:52:07 +0100401 paging_expect_imsi(IMSI);
402 paging_sent = false;
403 mncc_sends_to_cc(MNCC_SETUP_REQ, &mncc);
404
405 VERBOSE_ASSERT(paging_sent, == true, "%d");
Neels Hofmeyrcbcf89c2018-03-13 17:52:07 +0100406
407 btw("MS replies with Paging Response, and VLR sends Auth Request");
408 auth_request_sent = false;
409 auth_request_expect_rand = "c187a53a5e6b9d573cac7c74451fd46d";
410 auth_request_expect_autn = "1843a645b98d00005b2d666af46c45d9";
411 ms_sends_msg("062707"
412 "03575886" /* classmark 2 */
413 "089910070000106005" /* IMSI */);
414 VERBOSE_ASSERT(auth_request_sent, == true, "%d");
415
416 btw("MS sends Authen Response, VLR accepts and sends SecurityModeControl");
417 expect_security_mode_ctrl(NULL, "1159ec926a50e98c034a6b7d7c9f418d");
418 ms_sends_msg("0554" "7db47cf7" "2104" "f81e4dc7"); /* 2nd vector's res, s.a. */
419 VERBOSE_ASSERT(security_mode_ctrl_sent, == true, "%d");
420
421 btw("MS sends SecurityModeControl acceptance, VLR accepts, sends CC Setup");
422 dtap_expect_tx("0305" /* CC: Setup */);
Alexander Couzens2aaff752021-10-19 17:09:11 +0200423 ms_sends_security_mode_complete(1);
Neels Hofmeyrcbcf89c2018-03-13 17:52:07 +0100424
Neels Hofmeyr3f391dd2019-08-29 03:53:11 +0200425 btw("MS confirms call, we create a RAN-side RTP and forward MNCC_CALL_CONF_IND");
426 expect_crcx(RTP_TO_RAN);
Neels Hofmeyrcbcf89c2018-03-13 17:52:07 +0100427 cc_to_mncc_expect_tx(IMSI, MNCC_CALL_CONF_IND);
428 ms_sends_msg("8348" /* CC: Call Confirmed */
429 "0406600402000581" /* Bearer Capability */
430 "15020100" /* Call Control Capabilities */
431 "40080402600400021f00" /* Supported Codec List */);
Neels Hofmeyr3f391dd2019-08-29 03:53:11 +0200432 OSMO_ASSERT(got_crcx);
Neels Hofmeyrcbcf89c2018-03-13 17:52:07 +0100433 OSMO_ASSERT(cc_to_mncc_tx_confirmed);
434
Neels Hofmeyr3f391dd2019-08-29 03:53:11 +0200435 btw("MNCC sends MNCC_RTP_CREATE");
436 mncc_sends_to_cc(MNCC_RTP_CREATE, &mncc);
437
438 btw("MGW acknowledges the CRCX to RAN, triggering Assignment");
439 expect_iu_rab_assignment();
440 crcx_ok(RTP_TO_RAN);
441 OSMO_ASSERT(iu_rab_assignment_sent);
442
443 btw("Assignment completes, triggering CRCX to CN");
444 expect_crcx(RTP_TO_CN);
Neels Hofmeyrcec51b32023-03-01 03:47:45 +0100445 ms_sends_assignment_complete("AMR");
Neels Hofmeyr3f391dd2019-08-29 03:53:11 +0200446 OSMO_ASSERT(got_crcx);
447
448 btw("When the CN side RTP address is known, send MNCC_RTP_CREATE");
449 cc_to_mncc_expect_tx("", MNCC_RTP_CREATE);
450 crcx_ok(RTP_TO_CN);
Neels Hofmeyrcbcf89c2018-03-13 17:52:07 +0100451 fake_time_passes(1, 23);
452
453 cc_to_mncc_expect_tx("", MNCC_ALERT_IND);
454 ms_sends_msg("8381" /* CC: Alerting */);
455 OSMO_ASSERT(cc_to_mncc_tx_confirmed);
456
457 fake_time_passes(15, 23);
458
459 btw("The call failed, the BSC sends a BSSMAP Clear Request");
Vadim Yanitskiydd466cf2021-02-05 19:17:31 +0100460 cc_to_mncc_expect_tx("", MNCC_REL_IND);
Keith Whyteff17f8f2019-08-01 12:20:25 +0200461 dtap_expect_tx("032d0802e1af"); /* CC: Release */
Neels Hofmeyrcbcf89c2018-03-13 17:52:07 +0100462 expect_iu_release();
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100463 msc_a_release_cn(msub_msc_a(g_msub));
464 OSMO_ASSERT(dtap_tx_confirmed);
Neels Hofmeyrcbcf89c2018-03-13 17:52:07 +0100465 OSMO_ASSERT(cc_to_mncc_tx_confirmed);
466 OSMO_ASSERT(iu_release_sent);
467
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100468 ran_sends_clear_complete();
Neels Hofmeyrcbcf89c2018-03-13 17:52:07 +0100469 EXPECT_CONN_COUNT(0);
470
471 /* Make sure a pending release timer doesn't fire later to access freed data */
472 fake_time_passes(15, 23);
473
474 clear_vlr();
475 comment_end();
476}
477
Neels Hofmeyreb1cfdb2018-03-15 13:42:10 +0100478static void test_call_mo_to_unknown()
479{
480 struct gsm_mncc mncc = {
481 .imsi = IMSI,
482 };
483
484 comment_start();
485
486 fake_time_start();
487
Neels Hofmeyr11bf0bc2019-10-21 05:55:49 +0200488 lu_utran_tmsi();
Neels Hofmeyreb1cfdb2018-03-15 13:42:10 +0100489
490 BTW("after a while, a new conn sends a CM Service Request. VLR responds with Auth Req, 2nd auth vector");
491 auth_request_sent = false;
492 auth_request_expect_rand = "c187a53a5e6b9d573cac7c74451fd46d";
493 auth_request_expect_autn = "1843a645b98d00005b2d666af46c45d9";
494 cm_service_result_sent = RES_NONE;
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100495 ms_sends_msg("052471"
Neels Hofmeyreb1cfdb2018-03-15 13:42:10 +0100496 "03575886" /* classmark 2 */
497 "089910070000106005" /* IMSI */);
Neels Hofmeyreb1cfdb2018-03-15 13:42:10 +0100498 VERBOSE_ASSERT(cm_service_result_sent, == RES_NONE, "%d");
499 VERBOSE_ASSERT(auth_request_sent, == true, "%d");
500
501 btw("needs auth, not yet accepted");
502 EXPECT_ACCEPTED(false);
503
504 /* On UTRAN */
505 btw("MS sends Authen Response, VLR accepts and sends SecurityModeControl");
506 expect_security_mode_ctrl(NULL, "1159ec926a50e98c034a6b7d7c9f418d");
507 ms_sends_msg("0554" "7db47cf7" "2104" "f81e4dc7"); /* 2nd vector's res, s.a. */
508 VERBOSE_ASSERT(security_mode_ctrl_sent, == true, "%d");
509 VERBOSE_ASSERT(cm_service_result_sent, == RES_NONE, "%d");
510
511 btw("MS sends SecurityModeControl acceptance, VLR accepts; above Ciphering is an implicit CM Service Accept");
Alexander Couzens2aaff752021-10-19 17:09:11 +0200512 ms_sends_security_mode_complete(1);
Neels Hofmeyreb1cfdb2018-03-15 13:42:10 +0100513 VERBOSE_ASSERT(cm_service_result_sent, == RES_NONE, "%d");
514
515 BTW("a call is initiated");
516
517 btw("SETUP gets forwarded to MNCC");
518 cc_to_mncc_expect_tx(IMSI, MNCC_SETUP_IND);
519 ms_sends_msg("0385" /* CC, seq = 2 -> 0x80 | CC Setup = 0x5 */
520 "0406600402000581" /* Bearer Capability */
521 "5e038121f3" /* Called Number BCD */
522 "15020100" /* CC Capabilities */
523 "4008" /* Supported Codec List */
524 "04026000" /* UMTS: AMR 2 | AMR */
525 "00021f00" /* GSM: HR AMR | FR AMR | GSM EFR | GSM HR | GSM FR */
526 );
527 OSMO_ASSERT(cc_to_mncc_tx_confirmed);
528 mncc.callref = cc_to_mncc_tx_got_callref;
529
Neels Hofmeyr3f391dd2019-08-29 03:53:11 +0200530 btw("MNCC replies with MNCC_RTP_CREATE, causing MGW endpoint CRCX to RAN");
531 expect_crcx(RTP_TO_RAN);
532 mncc_sends_to_cc(MNCC_RTP_CREATE, &mncc);
533 OSMO_ASSERT(got_crcx);
534
535 btw("MGW acknowledges the CRCX, triggering Assignment");
536 expect_iu_rab_assignment();
537 crcx_ok(RTP_TO_RAN);
538 OSMO_ASSERT(iu_rab_assignment_sent);
539
540 btw("Assignment succeeds, triggering CRCX to CN");
541 expect_crcx(RTP_TO_CN);
Neels Hofmeyrcec51b32023-03-01 03:47:45 +0100542 ms_sends_assignment_complete("AMR");
Neels Hofmeyr3f391dd2019-08-29 03:53:11 +0200543 OSMO_ASSERT(got_crcx);
544
545 btw("CN RTP address is available, trigger MNCC_RTP_CREATE");
546 cc_to_mncc_expect_tx("", MNCC_RTP_CREATE);
547 crcx_ok(RTP_TO_CN);
548
Neels Hofmeyreb1cfdb2018-03-15 13:42:10 +0100549 btw("MNCC says that's fine");
550 dtap_expect_tx("8302" /* CC: Call Proceeding */);
551 mncc_sends_to_cc(MNCC_CALL_PROC_REQ, &mncc);
552 OSMO_ASSERT(dtap_tx_confirmed);
553
554 btw("But the other side's MSISDN could not be resolved, MNCC tells us to cancel");
555 dtap_expect_tx("832d" /* CC: Release Request */);
556 mncc_sends_to_cc(MNCC_REL_REQ, &mncc);
557
558 dtap_expect_tx("832d" /* CC: Release Request */);
559 fake_time_passes(10, 23);
560
561 expect_iu_release();
562 cc_to_mncc_expect_tx("", MNCC_REL_CNF);
563 ms_sends_msg("036a" /* CC: Release Complete */);
564 OSMO_ASSERT(cc_to_mncc_tx_confirmed);
565 OSMO_ASSERT(iu_release_sent);
566 OSMO_ASSERT(cc_to_mncc_tx_confirmed);
567
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100568 ran_sends_clear_complete();
Neels Hofmeyreb1cfdb2018-03-15 13:42:10 +0100569 EXPECT_CONN_COUNT(0);
570 clear_vlr();
571 comment_end();
572}
573
574static void test_call_mo_to_unknown_timeout()
575{
576 struct gsm_mncc mncc = {
577 .imsi = IMSI,
578 };
579
580 comment_start();
581
582 fake_time_start();
583
Neels Hofmeyr11bf0bc2019-10-21 05:55:49 +0200584 lu_utran_tmsi();
Neels Hofmeyreb1cfdb2018-03-15 13:42:10 +0100585
586 BTW("after a while, a new conn sends a CM Service Request. VLR responds with Auth Req, 2nd auth vector");
587 auth_request_sent = false;
588 auth_request_expect_rand = "c187a53a5e6b9d573cac7c74451fd46d";
589 auth_request_expect_autn = "1843a645b98d00005b2d666af46c45d9";
590 cm_service_result_sent = RES_NONE;
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100591 ms_sends_msg("052471"
Neels Hofmeyreb1cfdb2018-03-15 13:42:10 +0100592 "03575886" /* classmark 2 */
593 "089910070000106005" /* IMSI */);
Neels Hofmeyreb1cfdb2018-03-15 13:42:10 +0100594 VERBOSE_ASSERT(cm_service_result_sent, == RES_NONE, "%d");
595 VERBOSE_ASSERT(auth_request_sent, == true, "%d");
596
597 btw("needs auth, not yet accepted");
598 EXPECT_ACCEPTED(false);
599
600 /* On UTRAN */
601 btw("MS sends Authen Response, VLR accepts and sends SecurityModeControl");
602 expect_security_mode_ctrl(NULL, "1159ec926a50e98c034a6b7d7c9f418d");
603 ms_sends_msg("0554" "7db47cf7" "2104" "f81e4dc7"); /* 2nd vector's res, s.a. */
604 VERBOSE_ASSERT(security_mode_ctrl_sent, == true, "%d");
605 VERBOSE_ASSERT(cm_service_result_sent, == RES_NONE, "%d");
606
607 btw("MS sends SecurityModeControl acceptance, VLR accepts; above Ciphering is an implicit CM Service Accept");
Alexander Couzens2aaff752021-10-19 17:09:11 +0200608 ms_sends_security_mode_complete(1);
Neels Hofmeyreb1cfdb2018-03-15 13:42:10 +0100609 VERBOSE_ASSERT(cm_service_result_sent, == RES_NONE, "%d");
610
611 BTW("a call is initiated");
612
613 btw("SETUP gets forwarded to MNCC");
614 cc_to_mncc_expect_tx(IMSI, MNCC_SETUP_IND);
615 ms_sends_msg("0385" /* CC, seq = 2 -> 0x80 | CC Setup = 0x5 */
616 "0406600402000581" /* Bearer Capability */
617 "5e038121f3" /* Called Number BCD */
618 "15020100" /* CC Capabilities */
619 "4008" /* Supported Codec List */
620 "04026000" /* UMTS: AMR 2 | AMR */
621 "00021f00" /* GSM: HR AMR | FR AMR | GSM EFR | GSM HR | GSM FR */
622 );
623 OSMO_ASSERT(cc_to_mncc_tx_confirmed);
624 mncc.callref = cc_to_mncc_tx_got_callref;
625
Neels Hofmeyr3f391dd2019-08-29 03:53:11 +0200626 btw("MNCC replies with MNCC_RTP_CREATE, causing MGW endpoint CRCX to RAN");
627 expect_crcx(RTP_TO_RAN);
628 mncc_sends_to_cc(MNCC_RTP_CREATE, &mncc);
629 OSMO_ASSERT(got_crcx);
630
631 btw("MGW acknowledges the CRCX, triggering Assignment");
632 expect_iu_rab_assignment();
633 crcx_ok(RTP_TO_RAN);
634 OSMO_ASSERT(iu_rab_assignment_sent);
635
636 btw("Assignment succeeds, triggering CRCX to CN");
637 expect_crcx(RTP_TO_CN);
Neels Hofmeyrcec51b32023-03-01 03:47:45 +0100638 ms_sends_assignment_complete("AMR");
Neels Hofmeyr3f391dd2019-08-29 03:53:11 +0200639 OSMO_ASSERT(got_crcx);
640
641 btw("CN RTP address is available, trigger MNCC_RTP_CREATE");
642 cc_to_mncc_expect_tx("", MNCC_RTP_CREATE);
643 crcx_ok(RTP_TO_CN);
644
Neels Hofmeyreb1cfdb2018-03-15 13:42:10 +0100645 btw("MNCC says that's fine");
646 dtap_expect_tx("8302" /* CC: Call Proceeding */);
647 mncc_sends_to_cc(MNCC_CALL_PROC_REQ, &mncc);
648 OSMO_ASSERT(dtap_tx_confirmed);
649
650 btw("But the other side's MSISDN could not be resolved, MNCC tells us to cancel");
651 dtap_expect_tx("832d" /* CC: Release Request */);
652 mncc_sends_to_cc(MNCC_REL_REQ, &mncc);
653
654 btw("Despite our repeated CC Release Requests, the MS does not respond anymore");
655 dtap_expect_tx("832d" /* CC: Release Request */);
656 fake_time_passes(10, 23);
657
658 btw("The CC Release times out and we still properly clear the conn");
Neels Hofmeyreb1cfdb2018-03-15 13:42:10 +0100659 cc_to_mncc_expect_tx("", MNCC_REL_CNF);
Neels Hofmeyrd6a769b2018-03-12 23:59:07 +0100660 expect_iu_release();
Neels Hofmeyreb1cfdb2018-03-15 13:42:10 +0100661 fake_time_passes(10, 23);
662 OSMO_ASSERT(cc_to_mncc_tx_confirmed);
Neels Hofmeyreb1cfdb2018-03-15 13:42:10 +0100663 OSMO_ASSERT(iu_release_sent);
Neels Hofmeyreb1cfdb2018-03-15 13:42:10 +0100664
Neels Hofmeyrc4628a32018-12-07 14:47:34 +0100665 ran_sends_clear_complete();
Neels Hofmeyrd6a769b2018-03-12 23:59:07 +0100666 EXPECT_CONN_COUNT(0);
Neels Hofmeyreb1cfdb2018-03-15 13:42:10 +0100667 clear_vlr();
668 comment_end();
669}
670
671
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100672msc_vlr_test_func_t msc_vlr_tests[] = {
673 test_call_mo,
674 test_call_mt,
Neels Hofmeyrcbcf89c2018-03-13 17:52:07 +0100675 test_call_mt2,
Neels Hofmeyreb1cfdb2018-03-15 13:42:10 +0100676 test_call_mo_to_unknown,
677 test_call_mo_to_unknown_timeout,
Neels Hofmeyra99b4272017-11-21 17:13:23 +0100678 NULL
679};