From a8945ce37c23ba557b8b369943a5730b73c46604 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Fri, 30 Nov 2018 00:44:32 +0100 Subject: move ran_conn declarations to new ran_conn.h With the dawn of inter-BSC,MSC handover, adopting the MSC-A,-I,-T roles from 3GPP TS 49.008, the RAN connection shall soon be a neatly separated corner of osmo-msc, so gravitate ran_conn decarations to files of matching name. Also, the current chaos of API defined in files with mismatching/meaningless names drives me crazy. Change-Id: Ice31e6c43e46678538c65261f150c67e1d0845e5 --- include/osmocom/msc/Makefile.am | 1 + include/osmocom/msc/common_cs.h | 8 -- include/osmocom/msc/gsm_data.h | 136 -------------------- include/osmocom/msc/gsm_subscriber.h | 2 + include/osmocom/msc/iucs.h | 2 + include/osmocom/msc/msc_mgcp.h | 2 + include/osmocom/msc/osmo_msc.h | 102 +-------------- include/osmocom/msc/ran_conn.h | 238 +++++++++++++++++++++++++++++++++++ include/osmocom/msc/vlr.h | 2 +- 9 files changed, 250 insertions(+), 243 deletions(-) create mode 100644 include/osmocom/msc/ran_conn.h (limited to 'include') diff --git a/include/osmocom/msc/Makefile.am b/include/osmocom/msc/Makefile.am index 28e4b148e..9fa58c7a6 100644 --- a/include/osmocom/msc/Makefile.am +++ b/include/osmocom/msc/Makefile.am @@ -22,6 +22,7 @@ noinst_HEADERS = \ msc_mgcp.h \ a_reset.h \ osmo_msc.h \ + ran_conn.h \ rrlp.h \ signal.h \ silent_call.h \ diff --git a/include/osmocom/msc/common_cs.h b/include/osmocom/msc/common_cs.h index 410f1022a..097d3b157 100644 --- a/include/osmocom/msc/common_cs.h +++ b/include/osmocom/msc/common_cs.h @@ -7,12 +7,4 @@ struct gsm_network; typedef int (*mncc_recv_cb_t)(struct gsm_network *, struct msgb *); -#define MAX_A5_KEY_LEN (128/8) - -struct geran_encr { - uint8_t alg_id; - uint8_t key_len; - uint8_t key[MAX_A5_KEY_LEN]; -}; - struct gsm_network *gsm_network_init(void *ctx, mncc_recv_cb_t mncc_recv); diff --git a/include/osmocom/msc/gsm_data.h b/include/osmocom/msc/gsm_data.h index 12a02bd21..35ec752cd 100644 --- a/include/osmocom/msc/gsm_data.h +++ b/include/osmocom/msc/gsm_data.h @@ -12,7 +12,6 @@ #include #include #include -#include #include #include @@ -34,7 +33,6 @@ struct mncc_sock_state; struct vlr_instance; struct vlr_subscr; -struct ranap_ue_conn_ctx; #define tmsi_from_string(str) strtoul(str, NULL, 10) @@ -51,140 +49,6 @@ struct gsm_auth_tuple { }; #define GSM_KEY_SEQ_INVAL 7 /* GSM 04.08 - 10.5.1.2 */ -enum ran_type { - RAN_UNKNOWN, - RAN_GERAN_A, /* 2G / A-interface */ - RAN_UTRAN_IU, /* 3G / Iu-interface (IuCS or IuPS) */ -}; - -extern const struct value_string ran_type_names[]; -static inline const char *ran_type_name(enum ran_type val) -{ return get_value_string(ran_type_names, val); } - -struct gsm_classmark { - bool classmark1_set; - struct gsm48_classmark1 classmark1; - uint8_t classmark2_len; - uint8_t classmark2[3]; - uint8_t classmark3_len; - uint8_t classmark3[14]; /* if cm3 gets extended by spec, it will be truncated */ -}; - -enum integrity_protection_state { - INTEGRITY_PROTECTION_NONE = 0, - INTEGRITY_PROTECTION_IK = 1, - INTEGRITY_PROTECTION_IK_CK = 2, -}; - -enum complete_layer3_type { - COMPLETE_LAYER3_NONE, - COMPLETE_LAYER3_LU, - COMPLETE_LAYER3_CM_SERVICE_REQ, - COMPLETE_LAYER3_PAGING_RESP, -}; - -extern const struct value_string complete_layer3_type_names[]; -static inline const char *complete_layer3_type_name(enum complete_layer3_type val) -{ - return get_value_string(complete_layer3_type_names, val); -} - -/* active radio connection of a mobile subscriber */ -struct ran_conn { - /* global linked list of ran_conn instances */ - struct llist_head entry; - - /* FSM instance to control the RAN connection's permissions and lifetime. */ - struct osmo_fsm_inst *fi; - enum complete_layer3_type complete_layer3_type; - - /* usage count. If this drops to zero, we start the release - * towards A/Iu */ - uint32_t use_count; - uint32_t use_tokens; - - /* The MS has opened the conn with a CM Service Request, and we shall - * keep it open for an actual request (or until timeout). */ - bool received_cm_service_request; - - /* libmsc/libvlr subscriber information (if available) */ - struct vlr_subscr *vsub; - - /* LU expiration handling */ - uint8_t expire_timer_stopped; - /* SMS helpers for libmsc */ - uint8_t next_rp_ref; - - /* Are we part of a special "silent" call */ - int silent_call; - - /* back pointers */ - struct gsm_network *network; - - /* connected via 2G or 3G? */ - enum ran_type via_ran; - - uint16_t lac; - struct geran_encr geran_encr; - - /* "Temporary" storage for the case the VLR asked for Cipher Mode Command, but the MSC still - * wants to request a Classmark Update first. */ - struct { - bool umts_aka; - bool retrieve_imeisv; - } geran_set_cipher_mode; - - /* N(SD) expected in the received frame, per flow (TS 24.007 11.2.3.2.3.2.2) */ - uint8_t n_sd_next[4]; - - struct { - struct mgcp_ctx *mgcp_ctx; - unsigned int mgcp_rtp_endpoint; - - uint16_t local_port_ran; - char local_addr_ran[INET_ADDRSTRLEN]; - uint16_t remote_port_ran; - char remote_addr_ran[INET_ADDRSTRLEN]; - enum mgcp_codecs codec_ran; - - uint16_t local_port_cn; - char local_addr_cn[INET_ADDRSTRLEN]; - uint16_t remote_port_cn; - char remote_addr_cn[INET_ADDRSTRLEN]; - enum mgcp_codecs codec_cn; - } rtp; - - /* which Iu-CS connection, if any. */ - struct { - struct ranap_ue_conn_ctx *ue_ctx; - uint8_t rab_id; - bool waiting_for_release_complete; - } iu; - - struct { - /* A pointer to the SCCP user that handles - * the SCCP connections for this subscriber - * connection */ - struct osmo_sccp_user *scu; - - /* The address of the BSC that is associated - * with this RAN connection */ - struct osmo_sccp_addr bsc_addr; - - /* The connection identifier that is used - * to reference the SCCP connection that is - * associated with this RAN connection */ - uint32_t conn_id; - - bool waiting_for_clear_complete; - } a; - - /* Temporary storage for Classmark Information for times when a connection has no VLR subscriber - * associated yet. It will get copied to the VLR subscriber upon msc_vlr_subscr_assoc(). */ - struct gsm_classmark temporary_classmark; -}; - - enum { MSC_CTR_LOC_UPDATE_TYPE_ATTACH, MSC_CTR_LOC_UPDATE_TYPE_NORMAL, diff --git a/include/osmocom/msc/gsm_subscriber.h b/include/osmocom/msc/gsm_subscriber.h index ec2d3a41d..428b88918 100644 --- a/include/osmocom/msc/gsm_subscriber.h +++ b/include/osmocom/msc/gsm_subscriber.h @@ -8,6 +8,8 @@ #include +struct ran_conn; + #define GSM_NAME_LENGTH 160 #define GSM_EXTENSION_LENGTH 15 /* MSISDN can only be 15 digits length */ diff --git a/include/osmocom/msc/iucs.h b/include/osmocom/msc/iucs.h index 2a70c65cd..302edc0e6 100644 --- a/include/osmocom/msc/iucs.h +++ b/include/osmocom/msc/iucs.h @@ -2,6 +2,8 @@ #include +struct ranap_ue_conn_ctx; + int gsm0408_rcvmsg_iucs(struct gsm_network *network, struct msgb *msg, uint16_t *lac); diff --git a/include/osmocom/msc/msc_mgcp.h b/include/osmocom/msc/msc_mgcp.h index ddd883709..9d8b01dd1 100644 --- a/include/osmocom/msc/msc_mgcp.h +++ b/include/osmocom/msc/msc_mgcp.h @@ -23,6 +23,8 @@ #include #include +struct ran_conn; + /* MGCP state handler context. This context information stores all information * to handle the direction of the RTP streams via MGCP. There is one instance * of this context struct per RAN connection. diff --git a/include/osmocom/msc/osmo_msc.h b/include/osmocom/msc/osmo_msc.h index fe6e0cd7d..151201780 100644 --- a/include/osmocom/msc/osmo_msc.h +++ b/include/osmocom/msc/osmo_msc.h @@ -1,108 +1,14 @@ -/* Routines for the MSC handling */ - -#ifndef OSMO_MSC_H -#define OSMO_MSC_H +#pragma once -#include -#include +/* Routines for the MSC handling */ -#include +struct gsm_network; +struct vlr_subscr; #define MSC_HLR_REMOTE_IP_DEFAULT "127.0.0.1" #define MSC_HLR_REMOTE_PORT_DEFAULT OSMO_GSUP_PORT -enum ran_conn_fsm_event { - /* Accepted the initial Complete Layer 3 (starting to evaluate Authentication and Ciphering) */ - RAN_CONN_E_COMPLETE_LAYER_3, - /* Received Classmark Update, typically neede for Ciphering Mode Command */ - RAN_CONN_E_CLASSMARK_UPDATE, - /* LU or Process Access FSM has determined that this conn is good */ - RAN_CONN_E_ACCEPTED, - /* received first reply from MS in "real" CC, SMS, USSD communication */ - RAN_CONN_E_COMMUNICATING, - /* Some async action has completed, check again whether all is done */ - RAN_CONN_E_RELEASE_WHEN_UNUSED, - /* MS/BTS/BSC originated close request */ - RAN_CONN_E_MO_CLOSE, - /* MSC originated close request, e.g. failed authentication */ - RAN_CONN_E_CN_CLOSE, - /* The usage count for the conn has reached zero */ - RAN_CONN_E_UNUSED, -}; - -enum ran_conn_fsm_state { - RAN_CONN_S_NEW, - RAN_CONN_S_AUTH_CIPH, - RAN_CONN_S_WAIT_CLASSMARK_UPDATE, - RAN_CONN_S_ACCEPTED, - RAN_CONN_S_COMMUNICATING, - RAN_CONN_S_RELEASING, - RAN_CONN_S_RELEASED, -}; - -struct ran_conn *ran_conn_alloc(struct gsm_network *network, enum ran_type via_ran, uint16_t lac); - -void ran_conn_update_id(struct ran_conn *conn, enum complete_layer3_type from, const char *id); -char *ran_conn_get_conn_id(struct ran_conn *conn); - -void ran_conn_complete_layer_3(struct ran_conn *conn); - int msc_vlr_alloc(struct gsm_network *net); int msc_vlr_start(struct gsm_network *net); -void ran_conn_sapi_n_reject(struct ran_conn *conn, int dlci); -int ran_conn_clear_request(struct ran_conn *conn, uint32_t cause); -void ran_conn_compl_l3(struct ran_conn *conn, - struct msgb *msg, uint16_t chosen_channel); -void ran_conn_dtap(struct ran_conn *conn, struct msgb *msg); -int ran_conn_classmark_request_then_cipher_mode_cmd(struct ran_conn *conn, bool umts_aka, - bool retrieve_imeisv); -int ran_conn_geran_set_cipher_mode(struct ran_conn *conn, bool umts_aka, bool retrieve_imeisv); -void ran_conn_cipher_mode_compl(struct ran_conn *conn, struct msgb *msg, uint8_t alg_id); -void ran_conn_rx_sec_mode_compl(struct ran_conn *conn); -void ran_conn_classmark_chg(struct ran_conn *conn, - const uint8_t *cm2, uint8_t cm2_len, - const uint8_t *cm3, uint8_t cm3_len); -void ran_conn_assign_fail(struct ran_conn *conn, uint8_t cause, uint8_t *rr_cause); - -void ran_conn_init(void); -bool ran_conn_is_accepted(const struct ran_conn *conn); -bool ran_conn_is_establishing_auth_ciph(const struct ran_conn *conn); -void ran_conn_communicating(struct ran_conn *conn); -void ran_conn_close(struct ran_conn *conn, uint32_t cause); -void ran_conn_mo_close(struct ran_conn *conn, uint32_t cause); -bool ran_conn_in_release(struct ran_conn *conn); - -void ran_conn_rx_bssmap_clear_complete(struct ran_conn *conn); -void ran_conn_rx_iu_release_complete(struct ran_conn *conn); - -enum ran_conn_use { - RAN_CONN_USE_UNTRACKED = -1, - RAN_CONN_USE_COMPL_L3, - RAN_CONN_USE_DTAP, - RAN_CONN_USE_AUTH_CIPH, - RAN_CONN_USE_CM_SERVICE, - RAN_CONN_USE_TRANS_CC, - RAN_CONN_USE_TRANS_SMS, - RAN_CONN_USE_TRANS_NC_SS, - RAN_CONN_USE_SILENT_CALL, - RAN_CONN_USE_RELEASE, -}; - -extern const struct value_string ran_conn_use_names[]; -static inline const char *ran_conn_use_name(enum ran_conn_use val) -{ return get_value_string(ran_conn_use_names, val); } - -#define ran_conn_get(conn, balance_token) \ - _ran_conn_get(conn, balance_token, __FILE__, __LINE__) -#define ran_conn_put(conn, balance_token) \ - _ran_conn_put(conn, balance_token, __FILE__, __LINE__) -struct ran_conn * _ran_conn_get(struct ran_conn *conn, enum ran_conn_use balance_token, - const char *file, int line); -void _ran_conn_put(struct ran_conn *conn, enum ran_conn_use balance_token, - const char *file, int line); -bool ran_conn_used_by(struct ran_conn *conn, enum ran_conn_use token); - void msc_stop_paging(struct vlr_subscr *vsub); - -#endif diff --git a/include/osmocom/msc/ran_conn.h b/include/osmocom/msc/ran_conn.h new file mode 100644 index 000000000..d71872e8e --- /dev/null +++ b/include/osmocom/msc/ran_conn.h @@ -0,0 +1,238 @@ +#pragma once +/* MSC RAN connection implementation */ + +#include + +#include +#include +#include + +enum ran_type { + RAN_UNKNOWN, + RAN_GERAN_A, /* 2G / A-interface */ + RAN_UTRAN_IU, /* 3G / Iu-interface (IuCS or IuPS) */ +}; + +extern const struct value_string ran_type_names[]; +static inline const char *ran_type_name(enum ran_type val) +{ return get_value_string(ran_type_names, val); } + +enum ran_conn_fsm_event { + /* Accepted the initial Complete Layer 3 (starting to evaluate Authentication and Ciphering) */ + RAN_CONN_E_COMPLETE_LAYER_3, + /* Received Classmark Update, typically neede for Ciphering Mode Command */ + RAN_CONN_E_CLASSMARK_UPDATE, + /* LU or Process Access FSM has determined that this conn is good */ + RAN_CONN_E_ACCEPTED, + /* received first reply from MS in "real" CC, SMS, USSD communication */ + RAN_CONN_E_COMMUNICATING, + /* Some async action has completed, check again whether all is done */ + RAN_CONN_E_RELEASE_WHEN_UNUSED, + /* MS/BTS/BSC originated close request */ + RAN_CONN_E_MO_CLOSE, + /* MSC originated close request, e.g. failed authentication */ + RAN_CONN_E_CN_CLOSE, + /* The usage count for the conn has reached zero */ + RAN_CONN_E_UNUSED, +}; + +enum ran_conn_fsm_state { + RAN_CONN_S_NEW, + RAN_CONN_S_AUTH_CIPH, + RAN_CONN_S_WAIT_CLASSMARK_UPDATE, + RAN_CONN_S_ACCEPTED, + RAN_CONN_S_COMMUNICATING, + RAN_CONN_S_RELEASING, + RAN_CONN_S_RELEASED, +}; + +enum integrity_protection_state { + INTEGRITY_PROTECTION_NONE = 0, + INTEGRITY_PROTECTION_IK = 1, + INTEGRITY_PROTECTION_IK_CK = 2, +}; + +enum complete_layer3_type { + COMPLETE_LAYER3_NONE, + COMPLETE_LAYER3_LU, + COMPLETE_LAYER3_CM_SERVICE_REQ, + COMPLETE_LAYER3_PAGING_RESP, +}; + +#define MAX_A5_KEY_LEN (128/8) + +struct geran_encr { + uint8_t alg_id; + uint8_t key_len; + uint8_t key[MAX_A5_KEY_LEN]; +}; + +extern const struct value_string complete_layer3_type_names[]; +static inline const char *complete_layer3_type_name(enum complete_layer3_type val) +{ + return get_value_string(complete_layer3_type_names, val); +} + +struct gsm_classmark { + bool classmark1_set; + struct gsm48_classmark1 classmark1; + uint8_t classmark2_len; + uint8_t classmark2[3]; + uint8_t classmark3_len; + uint8_t classmark3[14]; /* if cm3 gets extended by spec, it will be truncated */ +}; + +/* active radio connection of a mobile subscriber */ +struct ran_conn { + /* global linked list of ran_conn instances */ + struct llist_head entry; + + /* FSM instance to control the RAN connection's permissions and lifetime. */ + struct osmo_fsm_inst *fi; + enum complete_layer3_type complete_layer3_type; + + /* usage count. If this drops to zero, we start the release + * towards A/Iu */ + uint32_t use_count; + uint32_t use_tokens; + + /* The MS has opened the conn with a CM Service Request, and we shall + * keep it open for an actual request (or until timeout). */ + bool received_cm_service_request; + + /* libmsc/libvlr subscriber information (if available) */ + struct vlr_subscr *vsub; + + /* LU expiration handling */ + uint8_t expire_timer_stopped; + /* SMS helpers for libmsc */ + uint8_t next_rp_ref; + + /* Are we part of a special "silent" call */ + int silent_call; + + /* back pointers */ + struct gsm_network *network; + + /* connected via 2G or 3G? */ + enum ran_type via_ran; + + uint16_t lac; + struct geran_encr geran_encr; + + /* "Temporary" storage for the case the VLR asked for Cipher Mode Command, but the MSC still + * wants to request a Classmark Update first. */ + struct { + bool umts_aka; + bool retrieve_imeisv; + } geran_set_cipher_mode; + + /* N(SD) expected in the received frame, per flow (TS 24.007 11.2.3.2.3.2.2) */ + uint8_t n_sd_next[4]; + + struct { + struct mgcp_ctx *mgcp_ctx; + unsigned int mgcp_rtp_endpoint; + + uint16_t local_port_ran; + char local_addr_ran[INET_ADDRSTRLEN]; + uint16_t remote_port_ran; + char remote_addr_ran[INET_ADDRSTRLEN]; + enum mgcp_codecs codec_ran; + + uint16_t local_port_cn; + char local_addr_cn[INET_ADDRSTRLEN]; + uint16_t remote_port_cn; + char remote_addr_cn[INET_ADDRSTRLEN]; + enum mgcp_codecs codec_cn; + } rtp; + + /* which Iu-CS connection, if any. */ + struct { + struct ranap_ue_conn_ctx *ue_ctx; + uint8_t rab_id; + bool waiting_for_release_complete; + } iu; + + struct { + /* A pointer to the SCCP user that handles + * the SCCP connections for this subscriber + * connection */ + struct osmo_sccp_user *scu; + + /* The address of the BSC that is associated + * with this RAN connection */ + struct osmo_sccp_addr bsc_addr; + + /* The connection identifier that is used + * to reference the SCCP connection that is + * associated with this RAN connection */ + uint32_t conn_id; + + bool waiting_for_clear_complete; + } a; + + /* Temporary storage for Classmark Information for times when a connection has no VLR subscriber + * associated yet. It will get copied to the VLR subscriber upon msc_vlr_subscr_assoc(). */ + struct gsm_classmark temporary_classmark; +}; + +struct ran_conn *ran_conn_alloc(struct gsm_network *network, enum ran_type via_ran, uint16_t lac); + +void ran_conn_update_id(struct ran_conn *conn, enum complete_layer3_type from, const char *id); +char *ran_conn_get_conn_id(struct ran_conn *conn); + +void ran_conn_complete_layer_3(struct ran_conn *conn); + +void ran_conn_sapi_n_reject(struct ran_conn *conn, int dlci); +int ran_conn_clear_request(struct ran_conn *conn, uint32_t cause); +void ran_conn_compl_l3(struct ran_conn *conn, + struct msgb *msg, uint16_t chosen_channel); +void ran_conn_dtap(struct ran_conn *conn, struct msgb *msg); +int ran_conn_classmark_request_then_cipher_mode_cmd(struct ran_conn *conn, bool umts_aka, + bool retrieve_imeisv); +int ran_conn_geran_set_cipher_mode(struct ran_conn *conn, bool umts_aka, bool retrieve_imeisv); +void ran_conn_cipher_mode_compl(struct ran_conn *conn, struct msgb *msg, uint8_t alg_id); +void ran_conn_rx_sec_mode_compl(struct ran_conn *conn); +void ran_conn_classmark_chg(struct ran_conn *conn, + const uint8_t *cm2, uint8_t cm2_len, + const uint8_t *cm3, uint8_t cm3_len); +void ran_conn_assign_fail(struct ran_conn *conn, uint8_t cause, uint8_t *rr_cause); + +void ran_conn_init(void); +bool ran_conn_is_accepted(const struct ran_conn *conn); +bool ran_conn_is_establishing_auth_ciph(const struct ran_conn *conn); +void ran_conn_communicating(struct ran_conn *conn); +void ran_conn_close(struct ran_conn *conn, uint32_t cause); +void ran_conn_mo_close(struct ran_conn *conn, uint32_t cause); +bool ran_conn_in_release(struct ran_conn *conn); + +void ran_conn_rx_bssmap_clear_complete(struct ran_conn *conn); +void ran_conn_rx_iu_release_complete(struct ran_conn *conn); + +enum ran_conn_use { + RAN_CONN_USE_UNTRACKED = -1, + RAN_CONN_USE_COMPL_L3, + RAN_CONN_USE_DTAP, + RAN_CONN_USE_AUTH_CIPH, + RAN_CONN_USE_CM_SERVICE, + RAN_CONN_USE_TRANS_CC, + RAN_CONN_USE_TRANS_SMS, + RAN_CONN_USE_TRANS_NC_SS, + RAN_CONN_USE_SILENT_CALL, + RAN_CONN_USE_RELEASE, +}; + +extern const struct value_string ran_conn_use_names[]; +static inline const char *ran_conn_use_name(enum ran_conn_use val) +{ return get_value_string(ran_conn_use_names, val); } + +#define ran_conn_get(conn, balance_token) \ + _ran_conn_get(conn, balance_token, __FILE__, __LINE__) +#define ran_conn_put(conn, balance_token) \ + _ran_conn_put(conn, balance_token, __FILE__, __LINE__) +struct ran_conn * _ran_conn_get(struct ran_conn *conn, enum ran_conn_use balance_token, + const char *file, int line); +void _ran_conn_put(struct ran_conn *conn, enum ran_conn_use balance_token, + const char *file, int line); +bool ran_conn_used_by(struct ran_conn *conn, enum ran_conn_use token); diff --git a/include/osmocom/msc/vlr.h b/include/osmocom/msc/vlr.h index 6e1690338..1168c3242 100644 --- a/include/osmocom/msc/vlr.h +++ b/include/osmocom/msc/vlr.h @@ -9,7 +9,7 @@ #include #include #include -#include +#include // for GSM_NAME_LENGTH #include #include -- cgit v1.2.3