Neels Hofmeyr | c4628a3 | 2018-12-07 14:47:34 +0100 | [diff] [blame] | 1 | /* main MSC management code... */ |
| 2 | |
| 3 | /* |
| 4 | * (C) 2010,2013 by Holger Hans Peter Freyther <zecke@selfish.org> |
| 5 | * (C) 2010 by On-Waves |
| 6 | * |
| 7 | * All Rights Reserved |
| 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 | |
Neels Hofmeyr | 4ac8009 | 2019-03-04 02:46:37 +0100 | [diff] [blame] | 24 | #include "config.h" |
Neels Hofmeyr | c4628a3 | 2018-12-07 14:47:34 +0100 | [diff] [blame] | 25 | |
| 26 | #include <osmocom/core/tdef.h> |
| 27 | |
| 28 | #include <osmocom/msc/gsm_data.h> |
| 29 | #include <osmocom/msc/vlr.h> |
| 30 | #include <osmocom/msc/gsup_client_mux.h> |
| 31 | #include <osmocom/msc/gsm_04_11_gsup.h> |
| 32 | #include <osmocom/msc/gsm_09_11.h> |
| 33 | |
Vadim Yanitskiy | ffc7f39 | 2020-01-18 18:39:41 +0700 | [diff] [blame] | 34 | /* TODO: would be great to have all timer declarations in one place */ |
| 35 | #include <osmocom/msc/ran_infra.h> |
| 36 | #include <osmocom/msc/sccp_ran.h> |
| 37 | #include <osmocom/msc/call_leg.h> |
| 38 | |
Neels Hofmeyr | c4628a3 | 2018-12-07 14:47:34 +0100 | [diff] [blame] | 39 | struct osmo_tdef mncc_tdefs[] = { |
| 40 | {} |
| 41 | }; |
| 42 | |
Vadim Yanitskiy | ffc7f39 | 2020-01-18 18:39:41 +0700 | [diff] [blame] | 43 | struct osmo_tdef_group msc_tdef_group[] = { |
Vadim Yanitskiy | baf71a7 | 2020-01-25 10:49:14 +0700 | [diff] [blame] | 44 | { .name = "vlr", .tdefs = msc_tdefs_vlr, .desc = "VLR (Visitors Location Register)" }, |
Vadim Yanitskiy | ffc7f39 | 2020-01-18 18:39:41 +0700 | [diff] [blame] | 45 | { .name = "mgw", .tdefs = g_mgw_tdefs, .desc = "MGW (Media Gateway) interface" }, |
| 46 | { .name = "mncc", .tdefs = mncc_tdefs, .desc = "MNCC (Mobile Network Call Control) interface" }, |
| 47 | { .name = "sccp", .tdefs = g_sccp_tdefs, .desc = "SCCP (Signalling Connection Control Part)" }, |
| 48 | { .name = "geran", .tdefs = msc_tdefs_geran, .desc = "GERAN (GSM EDGE Radio Access Network)" }, |
| 49 | { .name = "utran", .tdefs = msc_tdefs_utran, .desc = "UTRAN (UMTS Terrestrial Radio Access Network)" }, |
| 50 | { .name = "sgs", .tdefs = msc_tdefs_sgs, .desc = "SGs interface towards MME" }, |
| 51 | { /* terminator */ } |
| 52 | }; |
| 53 | |
Alexander Couzens | efa7b97 | 2019-04-27 23:45:37 +0200 | [diff] [blame] | 54 | #include <osmocom/core/stat_item.h> |
| 55 | |
Neels Hofmeyr | c4628a3 | 2018-12-07 14:47:34 +0100 | [diff] [blame] | 56 | struct gsm_network *gsm_network_init(void *ctx, mncc_recv_cb_t mncc_recv) |
| 57 | { |
| 58 | struct gsm_network *net; |
| 59 | |
| 60 | net = talloc_zero(ctx, struct gsm_network); |
| 61 | if (!net) |
| 62 | return NULL; |
| 63 | |
Keith Whyte | 1587ffb | 2020-08-28 13:36:58 +0200 | [diff] [blame] | 64 | net->sms_db_file_path = talloc_strdup(net, SMS_DEFAULT_DB_FILE_PATH); |
| 65 | |
Neels Hofmeyr | c4628a3 | 2018-12-07 14:47:34 +0100 | [diff] [blame] | 66 | net->plmn = (struct osmo_plmn_id){ .mcc=1, .mnc=1 }; |
| 67 | |
| 68 | /* Permit a compile-time default of A5/3 and A5/1 */ |
| 69 | net->a5_encryption_mask = (1 << 3) | (1 << 1); |
Neels Hofmeyr | 4dfb2ba | 2019-08-13 16:00:37 +0200 | [diff] [blame] | 70 | net->uea_encryption = true; |
Neels Hofmeyr | c4628a3 | 2018-12-07 14:47:34 +0100 | [diff] [blame] | 71 | |
Neels Hofmeyr | c4628a3 | 2018-12-07 14:47:34 +0100 | [diff] [blame] | 72 | net->mncc_guard_timeout = 180; |
| 73 | net->ncss_guard_timeout = 30; |
| 74 | |
Neels Hofmeyr | c4628a3 | 2018-12-07 14:47:34 +0100 | [diff] [blame] | 75 | INIT_LLIST_HEAD(&net->trans_list); |
| 76 | INIT_LLIST_HEAD(&net->upqueue); |
| 77 | INIT_LLIST_HEAD(&net->neighbor_ident_list); |
| 78 | |
| 79 | /* init statistics */ |
| 80 | net->msc_ctrs = rate_ctr_group_alloc(net, &msc_ctrg_desc, 0); |
| 81 | if (!net->msc_ctrs) { |
| 82 | talloc_free(net); |
| 83 | return NULL; |
| 84 | } |
Alexander Couzens | efa7b97 | 2019-04-27 23:45:37 +0200 | [diff] [blame] | 85 | |
| 86 | net->statg = osmo_stat_item_group_alloc(net, &msc_statg_desc, 0); |
| 87 | if (!net->statg) { |
| 88 | rate_ctr_group_free(net->msc_ctrs); |
| 89 | talloc_free(net); |
| 90 | return NULL; |
| 91 | } |
Neels Hofmeyr | c4628a3 | 2018-12-07 14:47:34 +0100 | [diff] [blame] | 92 | |
| 93 | net->mncc_tdefs = mncc_tdefs; |
| 94 | net->mncc_recv = mncc_recv; |
| 95 | |
| 96 | return net; |
| 97 | } |
| 98 | |
| 99 | void gsm_network_set_mncc_sock_path(struct gsm_network *net, const char *mncc_sock_path) |
| 100 | { |
| 101 | if (net->mncc_sock_path) |
| 102 | talloc_free(net->mncc_sock_path); |
| 103 | net->mncc_sock_path = mncc_sock_path ? talloc_strdup(net, mncc_sock_path) : NULL; |
| 104 | } |
| 105 | |
| 106 | /* Allocate net->vlr so that the VTY may configure the VLR's data structures */ |
| 107 | int msc_vlr_alloc(struct gsm_network *net) |
| 108 | { |
| 109 | net->vlr = vlr_alloc(net, &msc_vlr_ops); |
| 110 | if (!net->vlr) |
| 111 | return -ENOMEM; |
| 112 | net->vlr->user_ctx = net; |
| 113 | return 0; |
| 114 | } |
| 115 | |
| 116 | /* Launch the VLR, i.e. its GSUP connection */ |
| 117 | int msc_vlr_start(struct gsm_network *net) |
| 118 | { |
| 119 | OSMO_ASSERT(net->vlr); |
| 120 | OSMO_ASSERT(net->gcm); |
| 121 | |
| 122 | return vlr_start(net->vlr, net->gcm); |
| 123 | } |
| 124 | |
| 125 | int msc_gsup_client_start(struct gsm_network *net) |
| 126 | { |
| 127 | struct ipaccess_unit *ipa_dev; |
| 128 | |
| 129 | net->gcm = gsup_client_mux_alloc(net); |
| 130 | OSMO_ASSERT(net->gcm); |
| 131 | |
| 132 | ipa_dev = talloc_zero(net->gcm, struct ipaccess_unit); |
| 133 | ipa_dev->unit_name = "MSC"; |
| 134 | ipa_dev->serno = net->msc_ipa_name; /* NULL unless configured via VTY */ |
| 135 | ipa_dev->swversion = PACKAGE_NAME "-" PACKAGE_VERSION; |
| 136 | |
| 137 | *net->gcm = (struct gsup_client_mux){ |
| 138 | .rx_cb = { |
| 139 | /* vlr.c sets up its own cb and data */ |
| 140 | /* MSC-A and MSC-B set up their own cb and data */ |
Vadim Yanitskiy | 805eca2 | 2019-06-15 17:30:23 +0700 | [diff] [blame] | 141 | [OSMO_GSUP_MESSAGE_CLASS_SMS] = { .func = gsm411_gsup_rx, .data = net }, |
| 142 | [OSMO_GSUP_MESSAGE_CLASS_USSD] = { .func = gsm0911_gsup_rx, .data = net }, |
Neels Hofmeyr | c4628a3 | 2018-12-07 14:47:34 +0100 | [diff] [blame] | 143 | }, |
| 144 | }; |
| 145 | |
| 146 | return gsup_client_mux_start(net->gcm, net->gsup_server_addr_str, net->gsup_server_port, ipa_dev); |
| 147 | } |