#ifndef _GSM_DATA_H #define _GSM_DATA_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "gsm_data_shared.h" #include "osmux.h" /** annotations for msgb ownership */ #define __uses struct mncc_sock_state; struct vlr_instance; struct vlr_subscr; struct gsup_client_mux; #define tmsi_from_string(str) strtoul(str, NULL, 10) enum { MSC_CTR_LOC_UPDATE_TYPE_ATTACH, MSC_CTR_LOC_UPDATE_TYPE_NORMAL, MSC_CTR_LOC_UPDATE_TYPE_PERIODIC, MSC_CTR_LOC_UPDATE_TYPE_DETACH, MSC_CTR_LOC_UPDATE_FAILED, MSC_CTR_LOC_UPDATE_COMPLETED, MSC_CTR_CM_SERVICE_REQUEST_REJECTED, MSC_CTR_CM_SERVICE_REQUEST_ACCEPTED, MSC_CTR_PAGING_RESP_REJECTED, MSC_CTR_PAGING_RESP_ACCEPTED, MSC_CTR_SMS_SUBMITTED, MSC_CTR_SMS_NO_RECEIVER, MSC_CTR_SMS_DELIVERED, MSC_CTR_SMS_RP_ERR_MEM, MSC_CTR_SMS_RP_ERR_OTHER, MSC_CTR_SMS_DELIVER_UNKNOWN_ERROR, MSC_CTR_CALL_MO_SETUP, MSC_CTR_CALL_MO_CONNECT_ACK, MSC_CTR_CALL_MT_SETUP, MSC_CTR_CALL_MT_CONNECT, MSC_CTR_CALL_ACTIVE, MSC_CTR_CALL_COMPLETE, MSC_CTR_CALL_INCOMPLETE, MSC_CTR_NC_SS_MO_REQUESTS, MSC_CTR_NC_SS_MO_ESTABLISHED, MSC_CTR_NC_SS_MT_REQUESTS, MSC_CTR_NC_SS_MT_ESTABLISHED, MSC_CTR_BSSMAP_CIPHER_MODE_REJECT, MSC_CTR_BSSMAP_CIPHER_MODE_COMPLETE, }; static const struct rate_ctr_desc msc_ctr_description[] = { [MSC_CTR_LOC_UPDATE_TYPE_ATTACH] = {"loc_update_type:attach", "Received Location Update (IMSI Attach) requests."}, [MSC_CTR_LOC_UPDATE_TYPE_NORMAL] = {"loc_update_type:normal", "Received Location Update (LAC change) requests."}, [MSC_CTR_LOC_UPDATE_TYPE_PERIODIC] = {"loc_update_type:periodic", "Received (periodic) Location Update requests."}, [MSC_CTR_LOC_UPDATE_TYPE_DETACH] = {"loc_update_type:detach", "Received IMSI Detach indications."}, [MSC_CTR_LOC_UPDATE_FAILED] = {"loc_update_resp:failed", "Rejected Location Update requests."}, [MSC_CTR_LOC_UPDATE_COMPLETED] = {"loc_update_resp:completed", "Successful Location Update procedures."}, [MSC_CTR_CM_SERVICE_REQUEST_REJECTED] = {"cm_service_request:rejected", "Rejected CM Service Requests."}, [MSC_CTR_CM_SERVICE_REQUEST_ACCEPTED] = {"cm_service_request:accepted", "Accepted CM Service Requests."}, [MSC_CTR_PAGING_RESP_REJECTED] = {"paging_resp:rejected", "Rejected Paging Responses."}, [MSC_CTR_PAGING_RESP_ACCEPTED] = {"paging_resp:accepted", "Accepted Paging Responses."}, [MSC_CTR_SMS_SUBMITTED] = {"sms:submitted", "Total MO SMS received from the MS."}, [MSC_CTR_SMS_NO_RECEIVER] = {"sms:no_receiver", "Failed MO SMS delivery attempts (no receiver found)."}, [MSC_CTR_SMS_DELIVER_UNKNOWN_ERROR] = {"sms:deliver_unknown_error", "Failed MO SMS delivery attempts (other reason)."}, /* FIXME: "sms:delivered" should actually count number of _successfully_ delivered MT SMS. * The current description reflects its current (errorneous) behaviour. */ [MSC_CTR_SMS_DELIVERED] = {"sms:delivered", "Total MT SMS delivery attempts."}, [MSC_CTR_SMS_RP_ERR_MEM] = {"sms:rp_err_mem", "Failed MT SMS delivery attempts (no memory)."}, [MSC_CTR_SMS_RP_ERR_OTHER] = {"sms:rp_err_other", "Failed MT SMS delivery attempts (other reason)."}, [MSC_CTR_CALL_MO_SETUP] = {"call:mo_setup", "Received MO SETUP messages (MO call establishment)."}, [MSC_CTR_CALL_MO_CONNECT_ACK] = {"call:mo_connect_ack", "Received MO CONNECT messages (MO call establishment)."}, [MSC_CTR_CALL_MT_SETUP] = {"call:mt_setup", "Sent MT SETUP messages (MT call establishment)."}, [MSC_CTR_CALL_MT_CONNECT] = {"call:mt_connect", "Sent MT CONNECT messages (MT call establishment)."}, [MSC_CTR_CALL_ACTIVE] = {"call:active", "Calls that ever reached the active state."}, [MSC_CTR_CALL_COMPLETE] = {"call:complete", "Calls terminated by DISCONNECT message after reaching the active state."}, [MSC_CTR_CALL_INCOMPLETE] = {"call:incomplete", "Calls terminated by any other reason after reaching the active state."}, [MSC_CTR_NC_SS_MO_REQUESTS] = {"nc_ss:mo_requests", "Received MS-initiated call independent SS/USSD requests."}, [MSC_CTR_NC_SS_MO_ESTABLISHED] = {"nc_ss:mo_established", "Established MS-initiated call independent SS/USSD sessions."}, [MSC_CTR_NC_SS_MT_REQUESTS] = {"nc_ss:mt_requests", "Received network-initiated call independent SS/USSD requests."}, [MSC_CTR_NC_SS_MT_ESTABLISHED] = {"nc_ss:mt_established", "Established network-initiated call independent SS/USSD sessions."}, [MSC_CTR_BSSMAP_CIPHER_MODE_REJECT] = {"bssmap:cipher_mode_reject", "Number of CIPHER MODE REJECT messages processed by BSSMAP layer"}, [MSC_CTR_BSSMAP_CIPHER_MODE_COMPLETE] = {"bssmap:cipher_mode_complete", "Number of CIPHER MODE COMPLETE messages processed by BSSMAP layer"}, }; enum { MSC_STAT_ACTIVE_CALLS, MSC_STAT_ACTIVE_NC_SS, }; static const struct rate_ctr_group_desc msc_ctrg_desc = { "msc", "mobile switching center", OSMO_STATS_CLASS_GLOBAL, ARRAY_SIZE(msc_ctr_description), msc_ctr_description, }; static const struct osmo_stat_item_desc msc_stat_item_description[] = { [MSC_STAT_ACTIVE_CALLS] = { "msc.active_calls", "Currently active calls " , OSMO_STAT_ITEM_NO_UNIT, 4, 0}, [MSC_STAT_ACTIVE_NC_SS] = { "msc.active_nc_ss", "Currently active SS/USSD sessions", OSMO_STAT_ITEM_NO_UNIT, 4, 0}, }; static const struct osmo_stat_item_group_desc msc_statg_desc = { "net", "network statistics", OSMO_STATS_CLASS_GLOBAL, ARRAY_SIZE(msc_stat_item_description), msc_stat_item_description, }; #define MSC_PAGING_RESPONSE_TIMER_DEFAULT 10 struct gsm_tz { int override; /* if 0, use system's time zone instead. */ int hr; /* hour */ int mn; /* minute */ int dst; /* daylight savings */ }; struct gsm_network { /* TODO MSCSPLIT the gsm_network struct is basically a kitchen sink for * global settings and variables, "madly" mixing BSC and MSC stuff. Split * this in e.g. struct osmo_bsc and struct osmo_msc, with the things * these have in common, like country and network code, put in yet * separate structs and placed as members in osmo_bsc and osmo_msc. */ struct osmo_plmn_id plmn; char *name_long; char *name_short; /* bit-mask of permitted encryption algorithms. LSB=A5/0, MSB=A5/7 */ uint8_t a5_encryption_mask; bool authentication_required; int send_mm_info; /* Whether to use encryption on UTRAN. * TODO: we should offer a choice of UEA1 and/or UEA2, and probably replace this bool with a bit-mask of * permitted Iu encryption algorithms. See also OS#4143 and the 'encryption uea' vty command. */ bool uea_encryption; struct rate_ctr_group *msc_ctrs; struct osmo_stat_item_group *statg; /* layer 4 */ char *mncc_sock_path; struct mncc_sock_state *mncc_state; mncc_recv_cb_t mncc_recv; struct llist_head upqueue; struct osmo_tdef *mncc_tdefs; /* * TODO: Move the trans_list into the RAN connection and * create a pending list for MT transactions. These exist before * we have a RAN connection. */ struct llist_head trans_list; unsigned int paging_response_timer; /* Radio Resource Location Protocol (TS 04.31) */ struct { enum rrlp_mode mode; } rrlp; struct gsm_sms_queue *sms_queue; /* The "SMS over GSUP" kill-switch that basically breaks internal * SMS routing (i.e. SQLite DB and SMPP), and enables forwarding * of short messages over GSUP towards ESME (through VLR and HLR). * Please see OS#3587 for details. This is a temporary solution, * so it should be removed as soon as we move the SMS processing * logic to an external process (OsmoSMSC?). REMOVE ME! */ bool sms_over_gsup; /* control interface */ struct ctrl_handle *ctrl; /* if override is nonzero, this timezone data is used for all MM * contexts. */ /* TODO: in OsmoNITB, tz-override used to be BTS-specific. To enable * BTS|RNC specific timezone overrides for multi-tz networks in * OsmoMSC, this should be tied to the location area code (LAC). */ struct gsm_tz tz; /* MSC: GSUP server address of the HLR */ const char *gsup_server_addr_str; uint16_t gsup_server_port; struct gsup_client_mux *gcm; struct vlr_instance *vlr; /* Periodic location update default value */ uint8_t t3212; /* Global MNCC guard timer value */ int mncc_guard_timeout; /* Global guard timer value for NCSS sessions */ int ncss_guard_timeout; struct { struct osmo_tdef *tdefs; struct mgcp_client_conf conf; struct mgcp_client *client; } mgw; struct { /* CS7 instance id number (set via VTY) */ uint32_t cs7_instance; enum nsap_addr_enc rab_assign_addr_enc; struct sccp_ran_inst *sri; } iu; struct { /* CS7 instance id number (set via VTY) */ uint32_t cs7_instance; struct sccp_ran_inst *sri; } a; /* A list of neighbor BSCs. This list is defined statically via VTY and does not * necessarily correspond to BSCs attached to the A interface at a given moment. */ struct neighbor_ident_list *neighbor_list; struct { /* MSISDN to which to route MO emergency calls */ char *route_to_msisdn; } emergency; /* This is transmitted as IPA Serial Number tag, which is used for GSUP routing (e.g. in OsmoHLR). * For inter-MSC handover, the remote MSC's neighbor configuration requires to match this name. * If no name is set, the IPA Serial Number will be the same as the Unit Name, * and will be of the form 'MSC-00-00-00-00-00-00' */ char *msc_ipa_name; struct llist_head neighbor_ident_list; struct { uint64_t range_start; uint64_t range_end; uint64_t next; } handover_number; /* Whether we want to use Osmux against BSCs. Controlled via VTY */ enum osmux_usage use_osmux; /* Whether to use call waiting on the network */ bool call_waiting; }; struct osmo_esme; enum gsm_sms_source_id { SMS_SOURCE_UNKNOWN = 0, SMS_SOURCE_MS, /* received from MS */ SMS_SOURCE_VTY, /* received from VTY */ SMS_SOURCE_SMPP, /* received via SMPP */ }; #define SMS_TEXT_SIZE 256 struct gsm_sms_addr { uint8_t ton; uint8_t npi; char addr[21+1]; }; struct gsm_sms { unsigned long long id; struct vlr_subscr *receiver; struct gsm_sms_addr src, dst; enum gsm_sms_source_id source; struct { uint8_t transaction_id; uint32_t msg_ref; } gsm411; struct { struct osmo_esme *esme; uint32_t sequence_nr; int transaction_mode; char msg_id[16]; } smpp; unsigned long validity_minutes; time_t created; bool is_report; uint8_t reply_path_req; uint8_t status_rep_req; uint8_t ud_hdr_ind; uint8_t protocol_id; uint8_t data_coding_scheme; uint8_t msg_ref; uint8_t user_data_len; uint8_t user_data[SMS_TEXT_SIZE]; char text[SMS_TEXT_SIZE]; }; /* control interface handling */ int bsc_base_ctrl_cmds_install(void); int msc_ctrl_cmds_install(struct gsm_network *net); #endif /* _GSM_DATA_H */