Neels Hofmeyr | c4628a3 | 2018-12-07 14:47:34 +0100 | [diff] [blame] | 1 | #pragma once |
| 2 | |
Neels Hofmeyr | 46d526a | 2020-05-29 03:27:50 +0200 | [diff] [blame] | 3 | #include <osmocom/gsm/gsm48.h> |
| 4 | |
Neels Hofmeyr | c4628a3 | 2018-12-07 14:47:34 +0100 | [diff] [blame] | 5 | #include <osmocom/msc/debug.h> |
| 6 | #include <osmocom/msc/msc_roles.h> |
| 7 | |
| 8 | struct vlr_subscr; |
| 9 | struct gsm_network; |
| 10 | enum gsm48_gsm_cause; |
| 11 | enum complete_layer3_type; |
| 12 | enum osmo_gsup_access_network_protocol; |
| 13 | |
| 14 | #define VSUB_USE_MSUB "active-conn" |
| 15 | |
| 16 | struct 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 | |
| 27 | extern 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 | |
| 38 | struct 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) |
| 42 | struct 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 | |
| 45 | const char *msub_name(const struct msub *msub); |
| 46 | |
| 47 | struct msub *msub_for_vsub(const struct vlr_subscr *for_vsub); |
| 48 | |
| 49 | void msub_set_role(struct msub *msub, struct osmo_fsm_inst *msc_role); |
| 50 | void msub_remove_role(struct msub *msub, struct osmo_fsm_inst *fi); |
| 51 | |
| 52 | struct msc_a *msub_msc_a(const struct msub *msub); |
| 53 | struct msc_i *msub_msc_i(const struct msub *msub); |
| 54 | struct msc_t *msub_msc_t(const struct msub *msub); |
| 55 | struct ran_conn *msub_ran_conn(const struct msub *msub); |
| 56 | const char *msub_ran_conn_name(const struct msub *msub); |
| 57 | |
| 58 | int msub_set_vsub(struct msub *msub, struct vlr_subscr *vsub); |
| 59 | struct vlr_subscr *msub_vsub(const struct msub *msub); |
| 60 | struct gsm_network *msub_net(const struct msub *msub); |
| 61 | |
| 62 | int 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__) |
| 65 | int _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); |
| 67 | int msub_tx_an_apdu(struct msub *msub, enum msc_role from_role, enum msc_role to_role, struct an_apdu *an_apdu); |
| 68 | |
Neels Hofmeyr | 46d526a | 2020-05-29 03:27:50 +0200 | [diff] [blame] | 69 | void msub_update_id_from_mi(struct msub *msub, const struct osmo_mobile_identity *mi); |
Neels Hofmeyr | c4628a3 | 2018-12-07 14:47:34 +0100 | [diff] [blame] | 70 | void msub_update_id(struct msub *msub); |
| 71 | void msub_update_id_for_vsub(struct vlr_subscr *for_vsub); |
| 72 | |
| 73 | void msub_pending_cm_service_req_add(struct msub *msub, enum osmo_cm_service_type type); |
| 74 | unsigned int msub_pending_cm_service_req_count(struct msub *msub, enum osmo_cm_service_type type); |
| 75 | void msub_pending_cm_service_req_del(struct msub *msub, enum osmo_cm_service_type type); |
| 76 | |
| 77 | void msc_role_forget_conn(struct osmo_fsm_inst *role, struct ran_conn *conn); |
| 78 | |
| 79 | struct msgb *msc_role_ran_encode(struct osmo_fsm_inst *role, const struct ran_msg *ran_msg); |
| 80 | int 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); |