aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2018-11-30 00:44:32 +0100
committerNeels Hofmeyr <neels@hofmeyr.de>2018-11-30 22:46:15 +0100
commita8945ce37c23ba557b8b369943a5730b73c46604 (patch)
treee5c08df901cc1b15979c7afe5ed88d9bd2c4cfce
parent69d439534223121b912247926e6437f5af46c433 (diff)
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
-rw-r--r--include/osmocom/msc/Makefile.am1
-rw-r--r--include/osmocom/msc/common_cs.h8
-rw-r--r--include/osmocom/msc/gsm_data.h136
-rw-r--r--include/osmocom/msc/gsm_subscriber.h2
-rw-r--r--include/osmocom/msc/iucs.h2
-rw-r--r--include/osmocom/msc/msc_mgcp.h2
-rw-r--r--include/osmocom/msc/osmo_msc.h102
-rw-r--r--include/osmocom/msc/ran_conn.h238
-rw-r--r--include/osmocom/msc/vlr.h2
-rw-r--r--src/libmsc/ran_conn.c2
-rw-r--r--src/libmsc/rrlp.c1
11 files changed, 252 insertions, 244 deletions
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 <osmocom/core/stats.h>
#include <osmocom/gsm/gsm48.h>
#include <osmocom/crypt/auth.h>
-#include <osmocom/sigtran/sccp_sap.h>
#include <osmocom/msc/common.h>
#include <osmocom/msc/common_cs.h>
@@ -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 <osmocom/msc/gsm_data.h>
+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 <osmocom/msc/transaction.h>
+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 <osmocom/mgcp_client/mgcp_client.h>
#include <osmocom/msc/gsm_data.h>
+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 <osmocom/core/fsm.h>
-#include <osmocom/gsm/gsup.h>
+/* Routines for the MSC handling */
-#include <osmocom/msc/gsm_data.h>
+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 <stdint.h>
+
+#include <osmocom/gsm/protocol/gsm_04_08.h>
+#include <osmocom/sigtran/sccp_sap.h>
+#include <osmocom/mgcp_client/mgcp_client.h>
+
+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 <osmocom/gsm/gsm23003.h>
#include <osmocom/gsm/gsm0808.h>
#include <osmocom/gsm/gsup.h>
-#include <osmocom/msc/gsm_data.h>
+#include <osmocom/msc/ran_conn.h>
// for GSM_NAME_LENGTH
#include <osmocom/msc/gsm_subscriber.h>
#include <osmocom/gsupclient/gsup_client.h>
diff --git a/src/libmsc/ran_conn.c b/src/libmsc/ran_conn.c
index 5fab1c673..9b63f16a0 100644
--- a/src/libmsc/ran_conn.c
+++ b/src/libmsc/ran_conn.c
@@ -25,7 +25,7 @@
#include <osmocom/core/fsm.h>
#include <osmocom/core/signal.h>
-#include <osmocom/msc/osmo_msc.h>
+#include <osmocom/msc/ran_conn.h>
#include <osmocom/msc/vlr.h>
#include <osmocom/msc/debug.h>
#include <osmocom/msc/transaction.h>
diff --git a/src/libmsc/rrlp.c b/src/libmsc/rrlp.c
index c0747cdca..6ff30b748 100644
--- a/src/libmsc/rrlp.c
+++ b/src/libmsc/rrlp.c
@@ -27,6 +27,7 @@
#include <osmocom/msc/signal.h>
#include <osmocom/msc/debug.h>
#include <osmocom/msc/gsm_subscriber.h>
+#include <osmocom/msc/ran_conn.h>
/* RRLP msPositionReq, nsBased,
* Accuracy=60, Method=gps, ResponseTime=2, oneSet */