<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>