blob: 14f3e76ce2ca950a43519c87813fb40afb21639e [file] [log] [blame]
Neels Hofmeyrc4628a32018-12-07 14:47:34 +01001#pragma once
2
Neels Hofmeyr46d526a2020-05-29 03:27:50 +02003#include <osmocom/gsm/gsm48.h>
4
Neels Hofmeyrc4628a32018-12-07 14:47:34 +01005#include <osmocom/msc/debug.h>
6#include <osmocom/msc/msc_roles.h>
7
8struct vlr_subscr;
9struct gsm_network;
10enum gsm48_gsm_cause;
11enum complete_layer3_type;
12enum osmo_gsup_access_network_protocol;
13
14#define VSUB_USE_MSUB "active-conn"
15
16struct msub {
17 struct llist_head entry;
18 struct osmo_fsm_inst *fi;
19
20 struct vlr_subscr *vsub;
21
22 /* role = {MSC_ROLE_A, MSC_ROLE_I, MSC_ROLE_T} */
23 struct osmo_fsm_inst *role[MSC_ROLES_COUNT];
24 struct gsm_network *net;
25};
26
27extern struct llist_head msub_list;
28
29#define LOG_MSUB_CAT_SRC(msub, cat, level, file, line, fmt, args ...) \
30 LOGPSRC(cat, level, file, line, "(%s) " fmt, msub_name(msub), ## args)
31
32#define LOG_MSUB_CAT(msub, cat, level, fmt, args ...) \
33 LOGP(cat, level, "msub(%s) " fmt, msub_name(msub), ## args)
34
35#define LOG_MSUB(msub, level, fmt, args ...) \
36 LOG_MSUB_CAT(msub, DMSC, level, fmt, ## args)
37
38struct msub *msub_alloc(struct gsm_network *net);
39
40#define msub_role_alloc(MSUB, ROLE, FSM, ROLE_STRUCT, RAN) \
41 (ROLE_STRUCT*)_msub_role_alloc(MSUB, ROLE, FSM, sizeof(ROLE_STRUCT), #ROLE_STRUCT ":" #FSM, RAN)
42struct msc_role_common *_msub_role_alloc(struct msub *msub, enum msc_role role, struct osmo_fsm *role_fsm,
43 size_t struct_size, const char *struct_name, struct ran_infra *ran);
44
45const char *msub_name(const struct msub *msub);
46
47struct msub *msub_for_vsub(const struct vlr_subscr *for_vsub);
48
49void msub_set_role(struct msub *msub, struct osmo_fsm_inst *msc_role);
50void msub_remove_role(struct msub *msub, struct osmo_fsm_inst *fi);
51
52struct msc_a *msub_msc_a(const struct msub *msub);
53struct msc_i *msub_msc_i(const struct msub *msub);
54struct msc_t *msub_msc_t(const struct msub *msub);
55struct ran_conn *msub_ran_conn(const struct msub *msub);
56const char *msub_ran_conn_name(const struct msub *msub);
57
58int msub_set_vsub(struct msub *msub, struct vlr_subscr *vsub);
59struct vlr_subscr *msub_vsub(const struct msub *msub);
60struct gsm_network *msub_net(const struct msub *msub);
61
62int msub_role_to_role_event(struct msub *msub, enum msc_role from_role, enum msc_role to_role);
63#define msub_role_dispatch(MSUB, TO_ROLE, TO_ROLE_EVENT, AN_APDU) \
64 _msub_role_dispatch(MSUB, TO_ROLE, TO_ROLE_EVENT, AN_APDU, __FILE__, __LINE__)
65int _msub_role_dispatch(struct msub *msub, enum msc_role to_role, uint32_t to_role_event, const struct an_apdu *an_apdu,
66 const char *file, int line);
67int msub_tx_an_apdu(struct msub *msub, enum msc_role from_role, enum msc_role to_role, struct an_apdu *an_apdu);
68
Neels Hofmeyr46d526a2020-05-29 03:27:50 +020069void msub_update_id_from_mi(struct msub *msub, const struct osmo_mobile_identity *mi);
Neels Hofmeyrc4628a32018-12-07 14:47:34 +010070void msub_update_id(struct msub *msub);
71void msub_update_id_for_vsub(struct vlr_subscr *for_vsub);
72
73void msub_pending_cm_service_req_add(struct msub *msub, enum osmo_cm_service_type type);
74unsigned int msub_pending_cm_service_req_count(struct msub *msub, enum osmo_cm_service_type type);
75void msub_pending_cm_service_req_del(struct msub *msub, enum osmo_cm_service_type type);
76
77void msc_role_forget_conn(struct osmo_fsm_inst *role, struct ran_conn *conn);
78
79struct msgb *msc_role_ran_encode(struct osmo_fsm_inst *role, const struct ran_msg *ran_msg);
80int msc_role_ran_decode(struct osmo_fsm_inst *fi, const struct an_apdu *an_apdu,
81 ran_decode_cb_t decode_cb, void *decode_cb_data);