blob: fe6e0cd7d400a163894822224863db7ebb233b25 [file] [log] [blame]
Holger Hans Peter Freyther43b09092010-06-15 11:52:51 +08001/* Routines for the MSC handling */
2
3#ifndef OSMO_MSC_H
4#define OSMO_MSC_H
5
Harald Welte2483f1b2016-06-19 18:06:02 +02006#include <osmocom/core/fsm.h>
7#include <osmocom/gsm/gsup.h>
8
Neels Hofmeyr90843962017-09-04 15:04:35 +02009#include <osmocom/msc/gsm_data.h>
Harald Welte2483f1b2016-06-19 18:06:02 +020010
Harald Welte2483f1b2016-06-19 18:06:02 +020011#define MSC_HLR_REMOTE_IP_DEFAULT "127.0.0.1"
12#define MSC_HLR_REMOTE_PORT_DEFAULT OSMO_GSUP_PORT
13
Neels Hofmeyrc036b792018-11-29 22:37:51 +010014enum ran_conn_fsm_event {
Neels Hofmeyre3d3dc62018-03-31 00:02:14 +020015 /* Accepted the initial Complete Layer 3 (starting to evaluate Authentication and Ciphering) */
Neels Hofmeyrc036b792018-11-29 22:37:51 +010016 RAN_CONN_E_COMPLETE_LAYER_3,
Neels Hofmeyr3117b702018-09-13 03:23:07 +020017 /* Received Classmark Update, typically neede for Ciphering Mode Command */
Neels Hofmeyrc036b792018-11-29 22:37:51 +010018 RAN_CONN_E_CLASSMARK_UPDATE,
Harald Welte2483f1b2016-06-19 18:06:02 +020019 /* LU or Process Access FSM has determined that this conn is good */
Neels Hofmeyrc036b792018-11-29 22:37:51 +010020 RAN_CONN_E_ACCEPTED,
Harald Welte2483f1b2016-06-19 18:06:02 +020021 /* received first reply from MS in "real" CC, SMS, USSD communication */
Neels Hofmeyrc036b792018-11-29 22:37:51 +010022 RAN_CONN_E_COMMUNICATING,
Harald Welte2483f1b2016-06-19 18:06:02 +020023 /* Some async action has completed, check again whether all is done */
Neels Hofmeyrc036b792018-11-29 22:37:51 +010024 RAN_CONN_E_RELEASE_WHEN_UNUSED,
Harald Welte2483f1b2016-06-19 18:06:02 +020025 /* MS/BTS/BSC originated close request */
Neels Hofmeyrc036b792018-11-29 22:37:51 +010026 RAN_CONN_E_MO_CLOSE,
Harald Welte2483f1b2016-06-19 18:06:02 +020027 /* MSC originated close request, e.g. failed authentication */
Neels Hofmeyrc036b792018-11-29 22:37:51 +010028 RAN_CONN_E_CN_CLOSE,
Neels Hofmeyre3d3dc62018-03-31 00:02:14 +020029 /* The usage count for the conn has reached zero */
Neels Hofmeyrc036b792018-11-29 22:37:51 +010030 RAN_CONN_E_UNUSED,
Harald Welte2483f1b2016-06-19 18:06:02 +020031};
32
Neels Hofmeyrc036b792018-11-29 22:37:51 +010033enum ran_conn_fsm_state {
34 RAN_CONN_S_NEW,
35 RAN_CONN_S_AUTH_CIPH,
36 RAN_CONN_S_WAIT_CLASSMARK_UPDATE,
37 RAN_CONN_S_ACCEPTED,
38 RAN_CONN_S_COMMUNICATING,
39 RAN_CONN_S_RELEASING,
40 RAN_CONN_S_RELEASED,
Harald Welte2483f1b2016-06-19 18:06:02 +020041};
42
Neels Hofmeyrc036b792018-11-29 22:37:51 +010043struct ran_conn *ran_conn_alloc(struct gsm_network *network, enum ran_type via_ran, uint16_t lac);
Neels Hofmeyr93c74632018-04-02 23:10:28 +020044
Neels Hofmeyrc036b792018-11-29 22:37:51 +010045void ran_conn_update_id(struct ran_conn *conn, enum complete_layer3_type from, const char *id);
46char *ran_conn_get_conn_id(struct ran_conn *conn);
Neels Hofmeyre3d3dc62018-03-31 00:02:14 +020047
Neels Hofmeyrc036b792018-11-29 22:37:51 +010048void ran_conn_complete_layer_3(struct ran_conn *conn);
Harald Welte2483f1b2016-06-19 18:06:02 +020049
50int msc_vlr_alloc(struct gsm_network *net);
51int msc_vlr_start(struct gsm_network *net);
52
Neels Hofmeyr3c20a5e2018-11-30 01:08:36 +010053void ran_conn_sapi_n_reject(struct ran_conn *conn, int dlci);
54int ran_conn_clear_request(struct ran_conn *conn, uint32_t cause);
55void ran_conn_compl_l3(struct ran_conn *conn,
56 struct msgb *msg, uint16_t chosen_channel);
57void ran_conn_dtap(struct ran_conn *conn, struct msgb *msg);
58int ran_conn_classmark_request_then_cipher_mode_cmd(struct ran_conn *conn, bool umts_aka,
59 bool retrieve_imeisv);
60int ran_conn_geran_set_cipher_mode(struct ran_conn *conn, bool umts_aka, bool retrieve_imeisv);
61void ran_conn_cipher_mode_compl(struct ran_conn *conn, struct msgb *msg, uint8_t alg_id);
62void ran_conn_rx_sec_mode_compl(struct ran_conn *conn);
63void ran_conn_classmark_chg(struct ran_conn *conn,
64 const uint8_t *cm2, uint8_t cm2_len,
65 const uint8_t *cm3, uint8_t cm3_len);
66void ran_conn_assign_fail(struct ran_conn *conn, uint8_t cause, uint8_t *rr_cause);
Neels Hofmeyr84da6b12016-05-20 21:59:55 +020067
Neels Hofmeyrc036b792018-11-29 22:37:51 +010068void ran_conn_init(void);
69bool ran_conn_is_accepted(const struct ran_conn *conn);
70bool ran_conn_is_establishing_auth_ciph(const struct ran_conn *conn);
71void ran_conn_communicating(struct ran_conn *conn);
72void ran_conn_close(struct ran_conn *conn, uint32_t cause);
73void ran_conn_mo_close(struct ran_conn *conn, uint32_t cause);
74bool ran_conn_in_release(struct ran_conn *conn);
Harald Welte2483f1b2016-06-19 18:06:02 +020075
Neels Hofmeyrc036b792018-11-29 22:37:51 +010076void ran_conn_rx_bssmap_clear_complete(struct ran_conn *conn);
77void ran_conn_rx_iu_release_complete(struct ran_conn *conn);
Neels Hofmeyr4068ab22018-04-01 20:55:54 +020078
Neels Hofmeyrc036b792018-11-29 22:37:51 +010079enum ran_conn_use {
Neels Hofmeyr3c20a5e2018-11-30 01:08:36 +010080 RAN_CONN_USE_UNTRACKED = -1,
81 RAN_CONN_USE_COMPL_L3,
82 RAN_CONN_USE_DTAP,
83 RAN_CONN_USE_AUTH_CIPH,
84 RAN_CONN_USE_CM_SERVICE,
85 RAN_CONN_USE_TRANS_CC,
86 RAN_CONN_USE_TRANS_SMS,
87 RAN_CONN_USE_TRANS_NC_SS,
88 RAN_CONN_USE_SILENT_CALL,
89 RAN_CONN_USE_RELEASE,
Neels Hofmeyr6166f292017-11-22 14:33:12 +010090};
91
Neels Hofmeyrc036b792018-11-29 22:37:51 +010092extern const struct value_string ran_conn_use_names[];
93static inline const char *ran_conn_use_name(enum ran_conn_use val)
94{ return get_value_string(ran_conn_use_names, val); }
Neels Hofmeyr6166f292017-11-22 14:33:12 +010095
Neels Hofmeyrc036b792018-11-29 22:37:51 +010096#define ran_conn_get(conn, balance_token) \
97 _ran_conn_get(conn, balance_token, __FILE__, __LINE__)
98#define ran_conn_put(conn, balance_token) \
99 _ran_conn_put(conn, balance_token, __FILE__, __LINE__)
100struct ran_conn * _ran_conn_get(struct ran_conn *conn, enum ran_conn_use balance_token,
101 const char *file, int line);
102void _ran_conn_put(struct ran_conn *conn, enum ran_conn_use balance_token,
103 const char *file, int line);
104bool ran_conn_used_by(struct ran_conn *conn, enum ran_conn_use token);
Holger Hans Peter Freyther43b09092010-06-15 11:52:51 +0800105
Neels Hofmeyr84da6b12016-05-20 21:59:55 +0200106void msc_stop_paging(struct vlr_subscr *vsub);
107
Holger Hans Peter Freyther43b09092010-06-15 11:52:51 +0800108#endif