<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12032">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">move ran_conn declarations to new ran_conn.h<br><br>With the dawn of inter-BSC,MSC handover, adopting the MSC-A,-I,-T roles from<br>3GPP TS 49.008, the RAN connection shall soon be a neatly separated corner of<br>osmo-msc, so gravitate ran_conn decarations to files of matching name.<br><br>Also, the current chaos of API defined in files with mismatching/meaningless<br>names drives me crazy.<br><br>Change-Id: Ice31e6c43e46678538c65261f150c67e1d0845e5<br>---<br>M include/osmocom/msc/Makefile.am<br>M include/osmocom/msc/gsm_data.h<br>M include/osmocom/msc/gsm_subscriber.h<br>M include/osmocom/msc/msc_mgcp.h<br>M include/osmocom/msc/osmo_msc.h<br>A include/osmocom/msc/ran_conn.h<br>M include/osmocom/msc/vlr.h<br>M src/libmsc/rrlp.c<br>8 files changed, 242 insertions(+), 240 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/32/12032/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/msc/Makefile.am b/include/osmocom/msc/Makefile.am</span><br><span>index 28e4b14..9fa58c7 100644</span><br><span>--- a/include/osmocom/msc/Makefile.am</span><br><span>+++ b/include/osmocom/msc/Makefile.am</span><br><span>@@ -22,6 +22,7 @@</span><br><span> msc_mgcp.h \</span><br><span> a_reset.h \</span><br><span> osmo_msc.h \</span><br><span style="color: hsl(120, 100%, 40%);">+ ran_conn.h \</span><br><span> rrlp.h \</span><br><span> signal.h \</span><br><span> silent_call.h \</span><br><span>diff --git a/include/osmocom/msc/gsm_data.h b/include/osmocom/msc/gsm_data.h</span><br><span>index 0028a3d..35ec752 100644</span><br><span>--- a/include/osmocom/msc/gsm_data.h</span><br><span>+++ b/include/osmocom/msc/gsm_data.h</span><br><span>@@ -12,7 +12,6 @@</span><br><span> #include <osmocom/core/stats.h></span><br><span> #include <osmocom/gsm/gsm48.h></span><br><span> #include <osmocom/crypt/auth.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/sigtran/sccp_sap.h></span><br><span> </span><br><span> #include <osmocom/msc/common.h></span><br><span> #include <osmocom/msc/common_cs.h></span><br><span>@@ -34,7 +33,6 @@</span><br><span> struct mncc_sock_state;</span><br><span> struct vlr_instance;</span><br><span> struct vlr_subscr;</span><br><span style="color: hsl(0, 100%, 40%);">-struct ranap_ue_conn_ctx;</span><br><span> </span><br><span> #define tmsi_from_string(str) strtoul(str, NULL, 10)</span><br><span> </span><br><span>@@ -51,139 +49,6 @@</span><br><span> };</span><br><span> #define GSM_KEY_SEQ_INVAL 7 /* GSM 04.08 - 10.5.1.2 */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-enum ran_type {</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_UNKNOWN,</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_GERAN_A, /* 2G / A-interface */</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_UTRAN_IU, /* 3G / Iu-interface (IuCS or IuPS) */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-extern const struct value_string ran_type_names[];</span><br><span style="color: hsl(0, 100%, 40%);">-static inline const char *ran_type_name(enum ran_type val)</span><br><span style="color: hsl(0, 100%, 40%);">-{ return get_value_string(ran_type_names, val); }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_classmark {</span><br><span style="color: hsl(0, 100%, 40%);">- bool classmark1_set;</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm48_classmark1 classmark1;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t classmark2_len;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t classmark2[3];</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t classmark3_len;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t classmark3[14]; /* if cm3 gets extended by spec, it will be truncated */</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-enum integrity_protection_state {</span><br><span style="color: hsl(0, 100%, 40%);">- INTEGRITY_PROTECTION_NONE = 0,</span><br><span style="color: hsl(0, 100%, 40%);">- INTEGRITY_PROTECTION_IK = 1,</span><br><span style="color: hsl(0, 100%, 40%);">- INTEGRITY_PROTECTION_IK_CK = 2,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-enum complete_layer3_type {</span><br><span style="color: hsl(0, 100%, 40%);">- COMPLETE_LAYER3_NONE,</span><br><span style="color: hsl(0, 100%, 40%);">- COMPLETE_LAYER3_LU,</span><br><span style="color: hsl(0, 100%, 40%);">- COMPLETE_LAYER3_CM_SERVICE_REQ,</span><br><span style="color: hsl(0, 100%, 40%);">- COMPLETE_LAYER3_PAGING_RESP,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-extern const struct value_string complete_layer3_type_names[];</span><br><span style="color: hsl(0, 100%, 40%);">-static inline const char *complete_layer3_type_name(enum complete_layer3_type val)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- return get_value_string(complete_layer3_type_names, val);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* active radio connection of a mobile subscriber */</span><br><span style="color: hsl(0, 100%, 40%);">-struct ran_conn {</span><br><span style="color: hsl(0, 100%, 40%);">- /* global linked list of ran_conn instances */</span><br><span style="color: hsl(0, 100%, 40%);">- struct llist_head entry;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* FSM instance to control the RAN connection's permissions and lifetime. */</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_fsm_inst *fi;</span><br><span style="color: hsl(0, 100%, 40%);">- enum complete_layer3_type complete_layer3_type;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* usage count. If this drops to zero, we start the release</span><br><span style="color: hsl(0, 100%, 40%);">- * towards A/Iu */</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t use_count;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t use_tokens;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* The MS has opened the conn with a CM Service Request, and we shall</span><br><span style="color: hsl(0, 100%, 40%);">- * keep it open for an actual request (or until timeout). */</span><br><span style="color: hsl(0, 100%, 40%);">- bool received_cm_service_request;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* libmsc/libvlr subscriber information (if available) */</span><br><span style="color: hsl(0, 100%, 40%);">- struct vlr_subscr *vsub;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* LU expiration handling */</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t expire_timer_stopped;</span><br><span style="color: hsl(0, 100%, 40%);">- /* SMS helpers for libmsc */</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t next_rp_ref;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Are we part of a special "silent" call */</span><br><span style="color: hsl(0, 100%, 40%);">- int silent_call;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* back pointers */</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_network *network;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* connected via 2G or 3G? */</span><br><span style="color: hsl(0, 100%, 40%);">- enum ran_type via_ran;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t lac;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* "Temporary" storage for the case the VLR asked for Cipher Mode Command, but the MSC still</span><br><span style="color: hsl(0, 100%, 40%);">- * wants to request a Classmark Update first. */</span><br><span style="color: hsl(0, 100%, 40%);">- struct {</span><br><span style="color: hsl(0, 100%, 40%);">- bool umts_aka;</span><br><span style="color: hsl(0, 100%, 40%);">- bool retrieve_imeisv;</span><br><span style="color: hsl(0, 100%, 40%);">- } geran_set_cipher_mode;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* N(SD) expected in the received frame, per flow (TS 24.007 11.2.3.2.3.2.2) */</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t n_sd_next[4];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- struct {</span><br><span style="color: hsl(0, 100%, 40%);">- struct mgcp_ctx *mgcp_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int mgcp_rtp_endpoint;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t local_port_ran;</span><br><span style="color: hsl(0, 100%, 40%);">- char local_addr_ran[INET_ADDRSTRLEN];</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t remote_port_ran;</span><br><span style="color: hsl(0, 100%, 40%);">- char remote_addr_ran[INET_ADDRSTRLEN];</span><br><span style="color: hsl(0, 100%, 40%);">- enum mgcp_codecs codec_ran;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t local_port_cn;</span><br><span style="color: hsl(0, 100%, 40%);">- char local_addr_cn[INET_ADDRSTRLEN];</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t remote_port_cn;</span><br><span style="color: hsl(0, 100%, 40%);">- char remote_addr_cn[INET_ADDRSTRLEN];</span><br><span style="color: hsl(0, 100%, 40%);">- enum mgcp_codecs codec_cn;</span><br><span style="color: hsl(0, 100%, 40%);">- } rtp;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* which Iu-CS connection, if any. */</span><br><span style="color: hsl(0, 100%, 40%);">- struct {</span><br><span style="color: hsl(0, 100%, 40%);">- struct ranap_ue_conn_ctx *ue_ctx;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t rab_id;</span><br><span style="color: hsl(0, 100%, 40%);">- bool waiting_for_release_complete;</span><br><span style="color: hsl(0, 100%, 40%);">- } iu;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- struct {</span><br><span style="color: hsl(0, 100%, 40%);">- /* A pointer to the SCCP user that handles</span><br><span style="color: hsl(0, 100%, 40%);">- * the SCCP connections for this subscriber</span><br><span style="color: hsl(0, 100%, 40%);">- * connection */</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_sccp_user *scu;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* The address of the BSC that is associated</span><br><span style="color: hsl(0, 100%, 40%);">- * with this RAN connection */</span><br><span style="color: hsl(0, 100%, 40%);">- struct osmo_sccp_addr bsc_addr;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* The connection identifier that is used</span><br><span style="color: hsl(0, 100%, 40%);">- * to reference the SCCP connection that is</span><br><span style="color: hsl(0, 100%, 40%);">- * associated with this RAN connection */</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t conn_id;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- bool waiting_for_clear_complete;</span><br><span style="color: hsl(0, 100%, 40%);">- } a;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Temporary storage for Classmark Information for times when a connection has no VLR subscriber</span><br><span style="color: hsl(0, 100%, 40%);">- * associated yet. It will get copied to the VLR subscriber upon msc_vlr_subscr_assoc(). */</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_classmark temporary_classmark;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> enum {</span><br><span> MSC_CTR_LOC_UPDATE_TYPE_ATTACH,</span><br><span> MSC_CTR_LOC_UPDATE_TYPE_NORMAL,</span><br><span>diff --git a/include/osmocom/msc/gsm_subscriber.h b/include/osmocom/msc/gsm_subscriber.h</span><br><span>index ec2d3a4..428b889 100644</span><br><span>--- a/include/osmocom/msc/gsm_subscriber.h</span><br><span>+++ b/include/osmocom/msc/gsm_subscriber.h</span><br><span>@@ -8,6 +8,8 @@</span><br><span> </span><br><span> #include <osmocom/msc/gsm_data.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct ran_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #define GSM_NAME_LENGTH 160</span><br><span> </span><br><span> #define GSM_EXTENSION_LENGTH 15 /* MSISDN can only be 15 digits length */</span><br><span>diff --git a/include/osmocom/msc/msc_mgcp.h b/include/osmocom/msc/msc_mgcp.h</span><br><span>index ddd8837..9d8b01d 100644</span><br><span>--- a/include/osmocom/msc/msc_mgcp.h</span><br><span>+++ b/include/osmocom/msc/msc_mgcp.h</span><br><span>@@ -23,6 +23,8 @@</span><br><span> #include <osmocom/mgcp_client/mgcp_client.h></span><br><span> #include <osmocom/msc/gsm_data.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct ran_conn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* MGCP state handler context. This context information stores all information</span><br><span> * to handle the direction of the RTP streams via MGCP. There is one instance</span><br><span> * of this context struct per RAN connection.</span><br><span>diff --git a/include/osmocom/msc/osmo_msc.h b/include/osmocom/msc/osmo_msc.h</span><br><span>index d8b34d6..1512017 100644</span><br><span>--- a/include/osmocom/msc/osmo_msc.h</span><br><span>+++ b/include/osmocom/msc/osmo_msc.h</span><br><span>@@ -1,114 +1,14 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Routines for the MSC handling */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#ifndef OSMO_MSC_H</span><br><span style="color: hsl(0, 100%, 40%);">-#define OSMO_MSC_H</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/fsm.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsup.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/msc/gsm_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_network;</span><br><span style="color: hsl(120, 100%, 40%);">+struct vlr_subscr;</span><br><span> </span><br><span> #define MSC_HLR_REMOTE_IP_DEFAULT "127.0.0.1"</span><br><span> #define MSC_HLR_REMOTE_PORT_DEFAULT OSMO_GSUP_PORT</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-enum ran_conn_fsm_event {</span><br><span style="color: hsl(0, 100%, 40%);">- /* Accepted the initial Complete Layer 3 (starting to evaluate Authentication and Ciphering) */</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_E_COMPLETE_LAYER_3,</span><br><span style="color: hsl(0, 100%, 40%);">- /* Received Classmark Update, typically neede for Ciphering Mode Command */</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_E_CLASSMARK_UPDATE,</span><br><span style="color: hsl(0, 100%, 40%);">- /* LU or Process Access FSM has determined that this conn is good */</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_E_ACCEPTED,</span><br><span style="color: hsl(0, 100%, 40%);">- /* received first reply from MS in "real" CC, SMS, USSD communication */</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_E_COMMUNICATING,</span><br><span style="color: hsl(0, 100%, 40%);">- /* Some async action has completed, check again whether all is done */</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_E_RELEASE_WHEN_UNUSED,</span><br><span style="color: hsl(0, 100%, 40%);">- /* MS/BTS/BSC originated close request */</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_E_MO_CLOSE,</span><br><span style="color: hsl(0, 100%, 40%);">- /* MSC originated close request, e.g. failed authentication */</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_E_CN_CLOSE,</span><br><span style="color: hsl(0, 100%, 40%);">- /* The usage count for the conn has reached zero */</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_E_UNUSED,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-enum ran_conn_fsm_state {</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_S_NEW,</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_S_AUTH_CIPH,</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_S_WAIT_CLASSMARK_UPDATE,</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_S_ACCEPTED,</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_S_COMMUNICATING,</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_S_RELEASING,</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_S_RELEASED,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct ran_conn *ran_conn_alloc(struct gsm_network *network, enum ran_type via_ran, uint16_t lac);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void ran_conn_update_id(struct ran_conn *conn, enum complete_layer3_type from, const char *id);</span><br><span style="color: hsl(0, 100%, 40%);">-char *ran_conn_get_conn_id(struct ran_conn *conn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void ran_conn_complete_layer_3(struct ran_conn *conn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> int msc_vlr_alloc(struct gsm_network *net);</span><br><span> int msc_vlr_start(struct gsm_network *net);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void ran_conn_sapi_n_reject(struct ran_conn *conn, int dlci);</span><br><span style="color: hsl(0, 100%, 40%);">-int ran_conn_clear_request(struct ran_conn *conn, uint32_t cause);</span><br><span style="color: hsl(0, 100%, 40%);">-void ran_conn_compl_l3(struct ran_conn *conn,</span><br><span style="color: hsl(0, 100%, 40%);">- struct msgb *msg, uint16_t chosen_channel);</span><br><span style="color: hsl(0, 100%, 40%);">-void ran_conn_dtap(struct ran_conn *conn, struct msgb *msg);</span><br><span style="color: hsl(0, 100%, 40%);">-int ran_conn_classmark_request_then_cipher_mode_cmd(struct ran_conn *conn, bool umts_aka,</span><br><span style="color: hsl(0, 100%, 40%);">- bool retrieve_imeisv);</span><br><span style="color: hsl(0, 100%, 40%);">-int ran_conn_geran_set_cipher_mode(struct ran_conn *conn, bool umts_aka, bool retrieve_imeisv);</span><br><span style="color: hsl(0, 100%, 40%);">-void ran_conn_cipher_mode_compl(struct ran_conn *conn,</span><br><span style="color: hsl(0, 100%, 40%);">- struct msgb *msg, uint8_t alg_id);</span><br><span style="color: hsl(0, 100%, 40%);">-void ran_conn_rx_sec_mode_compl(struct ran_conn *conn);</span><br><span style="color: hsl(0, 100%, 40%);">-void ran_conn_classmark_chg(struct ran_conn *conn,</span><br><span style="color: hsl(0, 100%, 40%);">- const uint8_t *cm2, uint8_t cm2_len,</span><br><span style="color: hsl(0, 100%, 40%);">- const uint8_t *cm3, uint8_t cm3_len);</span><br><span style="color: hsl(0, 100%, 40%);">-void ran_conn_assign_fail(struct ran_conn *conn,</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t cause, uint8_t *rr_cause);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void ran_conn_init(void);</span><br><span style="color: hsl(0, 100%, 40%);">-bool ran_conn_is_accepted(const struct ran_conn *conn);</span><br><span style="color: hsl(0, 100%, 40%);">-bool ran_conn_is_establishing_auth_ciph(const struct ran_conn *conn);</span><br><span style="color: hsl(0, 100%, 40%);">-void ran_conn_communicating(struct ran_conn *conn);</span><br><span style="color: hsl(0, 100%, 40%);">-void ran_conn_close(struct ran_conn *conn, uint32_t cause);</span><br><span style="color: hsl(0, 100%, 40%);">-void ran_conn_mo_close(struct ran_conn *conn, uint32_t cause);</span><br><span style="color: hsl(0, 100%, 40%);">-bool ran_conn_in_release(struct ran_conn *conn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void ran_conn_rx_bssmap_clear_complete(struct ran_conn *conn);</span><br><span style="color: hsl(0, 100%, 40%);">-void ran_conn_rx_iu_release_complete(struct ran_conn *conn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-enum ran_conn_use {</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_USE_UNTRACKED = -1,</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_USE_COMPL_L3,</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_USE_DTAP,</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_USE_AUTH_CIPH,</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_USE_CM_SERVICE,</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_USE_TRANS_CC,</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_USE_TRANS_SMS,</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_USE_TRANS_NC_SS,</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_USE_SILENT_CALL,</span><br><span style="color: hsl(0, 100%, 40%);">- RAN_CONN_USE_RELEASE,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-extern const struct value_string ran_conn_use_names[];</span><br><span style="color: hsl(0, 100%, 40%);">-static inline const char *ran_conn_use_name(enum ran_conn_use val)</span><br><span style="color: hsl(0, 100%, 40%);">-{ return get_value_string(ran_conn_use_names, val); }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define ran_conn_get(conn, balance_token) \</span><br><span style="color: hsl(0, 100%, 40%);">- _ran_conn_get(conn, balance_token, __FILE__, __LINE__)</span><br><span style="color: hsl(0, 100%, 40%);">-#define ran_conn_put(conn, balance_token) \</span><br><span style="color: hsl(0, 100%, 40%);">- _ran_conn_put(conn, balance_token, __FILE__, __LINE__)</span><br><span style="color: hsl(0, 100%, 40%);">-struct ran_conn *</span><br><span style="color: hsl(0, 100%, 40%);">-_ran_conn_get(struct ran_conn *conn,</span><br><span style="color: hsl(0, 100%, 40%);">- enum ran_conn_use balance_token,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *file, int line);</span><br><span style="color: hsl(0, 100%, 40%);">-void _ran_conn_put(struct ran_conn *conn,</span><br><span style="color: hsl(0, 100%, 40%);">- enum ran_conn_use balance_token,</span><br><span style="color: hsl(0, 100%, 40%);">- const char *file, int line);</span><br><span style="color: hsl(0, 100%, 40%);">-bool ran_conn_used_by(struct ran_conn *conn,</span><br><span style="color: hsl(0, 100%, 40%);">- enum ran_conn_use token);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> void msc_stop_paging(struct vlr_subscr *vsub);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span>diff --git a/include/osmocom/msc/ran_conn.h b/include/osmocom/msc/ran_conn.h</span><br><span>new file mode 100644</span><br><span>index 0000000..10771b1</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmocom/msc/ran_conn.h</span><br><span>@@ -0,0 +1,231 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+/* MSC RAN connection implementation */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sigtran/sccp_sap.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/mgcp_client/mgcp_client.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum ran_type {</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_UNKNOWN,</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_GERAN_A, /* 2G / A-interface */</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_UTRAN_IU, /* 3G / Iu-interface (IuCS or IuPS) */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct value_string ran_type_names[];</span><br><span style="color: hsl(120, 100%, 40%);">+static inline const char *ran_type_name(enum ran_type val)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return get_value_string(ran_type_names, val); }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum ran_conn_fsm_event {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Accepted the initial Complete Layer 3 (starting to evaluate Authentication and Ciphering) */</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_E_COMPLETE_LAYER_3,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Received Classmark Update, typically neede for Ciphering Mode Command */</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_E_CLASSMARK_UPDATE,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* LU or Process Access FSM has determined that this conn is good */</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_E_ACCEPTED,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* received first reply from MS in "real" CC, SMS, USSD communication */</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_E_COMMUNICATING,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Some async action has completed, check again whether all is done */</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_E_RELEASE_WHEN_UNUSED,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* MS/BTS/BSC originated close request */</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_E_MO_CLOSE,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* MSC originated close request, e.g. failed authentication */</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_E_CN_CLOSE,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* The usage count for the conn has reached zero */</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_E_UNUSED,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum ran_conn_fsm_state {</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_S_NEW,</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_S_AUTH_CIPH,</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_S_WAIT_CLASSMARK_UPDATE,</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_S_ACCEPTED,</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_S_COMMUNICATING,</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_S_RELEASING,</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_S_RELEASED,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum integrity_protection_state {</span><br><span style="color: hsl(120, 100%, 40%);">+ INTEGRITY_PROTECTION_NONE = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+ INTEGRITY_PROTECTION_IK = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+ INTEGRITY_PROTECTION_IK_CK = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum complete_layer3_type {</span><br><span style="color: hsl(120, 100%, 40%);">+ COMPLETE_LAYER3_NONE,</span><br><span style="color: hsl(120, 100%, 40%);">+ COMPLETE_LAYER3_LU,</span><br><span style="color: hsl(120, 100%, 40%);">+ COMPLETE_LAYER3_CM_SERVICE_REQ,</span><br><span style="color: hsl(120, 100%, 40%);">+ COMPLETE_LAYER3_PAGING_RESP,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct value_string complete_layer3_type_names[];</span><br><span style="color: hsl(120, 100%, 40%);">+static inline const char *complete_layer3_type_name(enum complete_layer3_type val)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ return get_value_string(complete_layer3_type_names, val);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_classmark {</span><br><span style="color: hsl(120, 100%, 40%);">+ bool classmark1_set;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm48_classmark1 classmark1;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t classmark2_len;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t classmark2[3];</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t classmark3_len;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t classmark3[14]; /* if cm3 gets extended by spec, it will be truncated */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* active radio connection of a mobile subscriber */</span><br><span style="color: hsl(120, 100%, 40%);">+struct ran_conn {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* global linked list of ran_conn instances */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct llist_head entry;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FSM instance to control the RAN connection's permissions and lifetime. */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fsm_inst *fi;</span><br><span style="color: hsl(120, 100%, 40%);">+ enum complete_layer3_type complete_layer3_type;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* usage count. If this drops to zero, we start the release</span><br><span style="color: hsl(120, 100%, 40%);">+ * towards A/Iu */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t use_count;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t use_tokens;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* The MS has opened the conn with a CM Service Request, and we shall</span><br><span style="color: hsl(120, 100%, 40%);">+ * keep it open for an actual request (or until timeout). */</span><br><span style="color: hsl(120, 100%, 40%);">+ bool received_cm_service_request;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* libmsc/libvlr subscriber information (if available) */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct vlr_subscr *vsub;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* LU expiration handling */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t expire_timer_stopped;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* SMS helpers for libmsc */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t next_rp_ref;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Are we part of a special "silent" call */</span><br><span style="color: hsl(120, 100%, 40%);">+ int silent_call;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* back pointers */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_network *network;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* connected via 2G or 3G? */</span><br><span style="color: hsl(120, 100%, 40%);">+ enum ran_type via_ran;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t lac;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* "Temporary" storage for the case the VLR asked for Cipher Mode Command, but the MSC still</span><br><span style="color: hsl(120, 100%, 40%);">+ * wants to request a Classmark Update first. */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct {</span><br><span style="color: hsl(120, 100%, 40%);">+ bool umts_aka;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool retrieve_imeisv;</span><br><span style="color: hsl(120, 100%, 40%);">+ } geran_set_cipher_mode;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* N(SD) expected in the received frame, per flow (TS 24.007 11.2.3.2.3.2.2) */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t n_sd_next[4];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ struct {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct mgcp_ctx *mgcp_ctx;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int mgcp_rtp_endpoint;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t local_port_ran;</span><br><span style="color: hsl(120, 100%, 40%);">+ char local_addr_ran[INET_ADDRSTRLEN];</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t remote_port_ran;</span><br><span style="color: hsl(120, 100%, 40%);">+ char remote_addr_ran[INET_ADDRSTRLEN];</span><br><span style="color: hsl(120, 100%, 40%);">+ enum mgcp_codecs codec_ran;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t local_port_cn;</span><br><span style="color: hsl(120, 100%, 40%);">+ char local_addr_cn[INET_ADDRSTRLEN];</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t remote_port_cn;</span><br><span style="color: hsl(120, 100%, 40%);">+ char remote_addr_cn[INET_ADDRSTRLEN];</span><br><span style="color: hsl(120, 100%, 40%);">+ enum mgcp_codecs codec_cn;</span><br><span style="color: hsl(120, 100%, 40%);">+ } rtp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* which Iu-CS connection, if any. */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct ranap_ue_conn_ctx *ue_ctx;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t rab_id;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool waiting_for_release_complete;</span><br><span style="color: hsl(120, 100%, 40%);">+ } iu;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ struct {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* A pointer to the SCCP user that handles</span><br><span style="color: hsl(120, 100%, 40%);">+ * the SCCP connections for this subscriber</span><br><span style="color: hsl(120, 100%, 40%);">+ * connection */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_sccp_user *scu;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* The address of the BSC that is associated</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this RAN connection */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_sccp_addr bsc_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* The connection identifier that is used</span><br><span style="color: hsl(120, 100%, 40%);">+ * to reference the SCCP connection that is</span><br><span style="color: hsl(120, 100%, 40%);">+ * associated with this RAN connection */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t conn_id;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ bool waiting_for_clear_complete;</span><br><span style="color: hsl(120, 100%, 40%);">+ } a;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Temporary storage for Classmark Information for times when a connection has no VLR subscriber</span><br><span style="color: hsl(120, 100%, 40%);">+ * associated yet. It will get copied to the VLR subscriber upon msc_vlr_subscr_assoc(). */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_classmark temporary_classmark;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct ran_conn *ran_conn_alloc(struct gsm_network *network, enum ran_type via_ran, uint16_t lac);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void ran_conn_update_id(struct ran_conn *conn, enum complete_layer3_type from, const char *id);</span><br><span style="color: hsl(120, 100%, 40%);">+char *ran_conn_get_conn_id(struct ran_conn *conn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void ran_conn_complete_layer_3(struct ran_conn *conn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void ran_conn_sapi_n_reject(struct ran_conn *conn, int dlci);</span><br><span style="color: hsl(120, 100%, 40%);">+int ran_conn_clear_request(struct ran_conn *conn, uint32_t cause);</span><br><span style="color: hsl(120, 100%, 40%);">+void ran_conn_compl_l3(struct ran_conn *conn,</span><br><span style="color: hsl(120, 100%, 40%);">+ struct msgb *msg, uint16_t chosen_channel);</span><br><span style="color: hsl(120, 100%, 40%);">+void ran_conn_dtap(struct ran_conn *conn, struct msgb *msg);</span><br><span style="color: hsl(120, 100%, 40%);">+int ran_conn_classmark_request_then_cipher_mode_cmd(struct ran_conn *conn, bool umts_aka,</span><br><span style="color: hsl(120, 100%, 40%);">+ bool retrieve_imeisv);</span><br><span style="color: hsl(120, 100%, 40%);">+int ran_conn_geran_set_cipher_mode(struct ran_conn *conn, bool umts_aka, bool retrieve_imeisv);</span><br><span style="color: hsl(120, 100%, 40%);">+void ran_conn_cipher_mode_compl(struct ran_conn *conn,</span><br><span style="color: hsl(120, 100%, 40%);">+ struct msgb *msg, uint8_t alg_id);</span><br><span style="color: hsl(120, 100%, 40%);">+void ran_conn_rx_sec_mode_compl(struct ran_conn *conn);</span><br><span style="color: hsl(120, 100%, 40%);">+void ran_conn_classmark_chg(struct ran_conn *conn,</span><br><span style="color: hsl(120, 100%, 40%);">+ const uint8_t *cm2, uint8_t cm2_len,</span><br><span style="color: hsl(120, 100%, 40%);">+ const uint8_t *cm3, uint8_t cm3_len);</span><br><span style="color: hsl(120, 100%, 40%);">+void ran_conn_assign_fail(struct ran_conn *conn,</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t cause, uint8_t *rr_cause);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void ran_conn_init(void);</span><br><span style="color: hsl(120, 100%, 40%);">+bool ran_conn_is_accepted(const struct ran_conn *conn);</span><br><span style="color: hsl(120, 100%, 40%);">+bool ran_conn_is_establishing_auth_ciph(const struct ran_conn *conn);</span><br><span style="color: hsl(120, 100%, 40%);">+void ran_conn_communicating(struct ran_conn *conn);</span><br><span style="color: hsl(120, 100%, 40%);">+void ran_conn_close(struct ran_conn *conn, uint32_t cause);</span><br><span style="color: hsl(120, 100%, 40%);">+void ran_conn_mo_close(struct ran_conn *conn, uint32_t cause);</span><br><span style="color: hsl(120, 100%, 40%);">+bool ran_conn_in_release(struct ran_conn *conn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void ran_conn_rx_bssmap_clear_complete(struct ran_conn *conn);</span><br><span style="color: hsl(120, 100%, 40%);">+void ran_conn_rx_iu_release_complete(struct ran_conn *conn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum ran_conn_use {</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_USE_UNTRACKED = -1,</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_USE_COMPL_L3,</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_USE_DTAP,</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_USE_AUTH_CIPH,</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_USE_CM_SERVICE,</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_USE_TRANS_CC,</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_USE_TRANS_SMS,</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_USE_TRANS_NC_SS,</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_USE_SILENT_CALL,</span><br><span style="color: hsl(120, 100%, 40%);">+ RAN_CONN_USE_RELEASE,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct value_string ran_conn_use_names[];</span><br><span style="color: hsl(120, 100%, 40%);">+static inline const char *ran_conn_use_name(enum ran_conn_use val)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return get_value_string(ran_conn_use_names, val); }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define ran_conn_get(conn, balance_token) \</span><br><span style="color: hsl(120, 100%, 40%);">+ _ran_conn_get(conn, balance_token, __FILE__, __LINE__)</span><br><span style="color: hsl(120, 100%, 40%);">+#define ran_conn_put(conn, balance_token) \</span><br><span style="color: hsl(120, 100%, 40%);">+ _ran_conn_put(conn, balance_token, __FILE__, __LINE__)</span><br><span style="color: hsl(120, 100%, 40%);">+struct ran_conn * _ran_conn_get(struct ran_conn *conn, enum ran_conn_use balance_token,</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *file, int line);</span><br><span style="color: hsl(120, 100%, 40%);">+void _ran_conn_put(struct ran_conn *conn, enum ran_conn_use balance_token,</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *file, int line);</span><br><span style="color: hsl(120, 100%, 40%);">+bool ran_conn_used_by(struct ran_conn *conn, enum ran_conn_use token);</span><br><span>diff --git a/include/osmocom/msc/vlr.h b/include/osmocom/msc/vlr.h</span><br><span>index 6e16903..1168c32 100644</span><br><span>--- a/include/osmocom/msc/vlr.h</span><br><span>+++ b/include/osmocom/msc/vlr.h</span><br><span>@@ -9,7 +9,7 @@</span><br><span> #include <osmocom/gsm/gsm23003.h></span><br><span> #include <osmocom/gsm/gsm0808.h></span><br><span> #include <osmocom/gsm/gsup.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/msc/gsm_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/msc/ran_conn.h></span><br><span> // for GSM_NAME_LENGTH</span><br><span> #include <osmocom/msc/gsm_subscriber.h></span><br><span> #include <osmocom/gsupclient/gsup_client.h></span><br><span>diff --git a/src/libmsc/rrlp.c b/src/libmsc/rrlp.c</span><br><span>index c0747cd..6ff30b7 100644</span><br><span>--- a/src/libmsc/rrlp.c</span><br><span>+++ b/src/libmsc/rrlp.c</span><br><span>@@ -27,6 +27,7 @@</span><br><span> #include <osmocom/msc/signal.h></span><br><span> #include <osmocom/msc/debug.h></span><br><span> #include <osmocom/msc/gsm_subscriber.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/msc/ran_conn.h></span><br><span> </span><br><span> /* RRLP msPositionReq, nsBased,</span><br><span> * Accuracy=60, Method=gps, ResponseTime=2, oneSet */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12032">change 12032</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/12032"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-msc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ice31e6c43e46678538c65261f150c67e1d0845e5 </div>
<div style="display:none"> Gerrit-Change-Number: 12032 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>