aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/include
diff options
context:
space:
mode:
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2016-05-20 21:59:55 +0200
committerNeels Hofmeyr <nhofmeyr@sysmocom.de>2017-03-16 19:29:31 +0100
commit6c89dc54cdfdaf1b407b6eb6bb9083dde8188915 (patch)
tree0697e616cf8b94d0889a2e45c3c1d5bc254adf57 /openbsc/include
parent8c1ed1c6b7a698f4a844a0097f7dd732ebf5a443 (diff)
Implement IuCS (large refactoring and addition)
osmo-nitb becomes osmo-msc add DIUCS debug log constant add iucs.[hc] add msc vty, remove nitb vty add libiudummy, to avoid linking Iu deps in tests Use new msc_tx_dtap() instead of gsm0808_submit_dtap() libmgcp: add mgcpgw client API bridge calls via mgcpgw mgcp: hack RAB success from nano3G: patch first RTP payload The ip.access nano3G needs the first RTP payload's first two bytes to read hex 'e400', or it will reject the RAB assignment. Add flag patched_first_rtp_payload to mgcp_rtp_state to detect the first RTP payload on a stream, and overwrite its first bytes with e400. This should probably be configurable, but seems to not harm other femto cells (as long as we patch only the first RTP payload in each stream). Only do this when sending to the BTS side. Change-Id: Ie13ff348117e892d41b8355ab6c24915301eaeaf
Diffstat (limited to 'openbsc/include')
-rw-r--r--openbsc/include/openbsc/Makefile.am4
-rw-r--r--openbsc/include/openbsc/common.h6
-rw-r--r--openbsc/include/openbsc/debug.h1
-rw-r--r--openbsc/include/openbsc/gprs_gmm.h2
-rw-r--r--openbsc/include/openbsc/gsm_data.h24
-rw-r--r--openbsc/include/openbsc/gsm_subscriber.h9
-rw-r--r--openbsc/include/openbsc/iu.h20
-rw-r--r--openbsc/include/openbsc/iucs.h7
-rw-r--r--openbsc/include/openbsc/iucs_ranap.h7
-rw-r--r--openbsc/include/openbsc/mgcp.h15
-rw-r--r--openbsc/include/openbsc/mgcp_internal.h10
-rw-r--r--openbsc/include/openbsc/mgcpgw_client.h87
-rw-r--r--openbsc/include/openbsc/msc_ifaces.h13
-rw-r--r--openbsc/include/openbsc/osmo_msc.h11
-rw-r--r--openbsc/include/openbsc/sgsn.h5
-rw-r--r--openbsc/include/openbsc/transaction.h15
-rw-r--r--openbsc/include/openbsc/vlr.h7
-rw-r--r--openbsc/include/openbsc/vty.h2
18 files changed, 229 insertions, 16 deletions
diff --git a/openbsc/include/openbsc/Makefile.am b/openbsc/include/openbsc/Makefile.am
index 1091e8a04..14396b74a 100644
--- a/openbsc/include/openbsc/Makefile.am
+++ b/openbsc/include/openbsc/Makefile.am
@@ -14,6 +14,7 @@ noinst_HEADERS = \
bss.h \
bts_ipaccess_nanobts_omlattr.h \
chan_alloc.h \
+ common.h \
common_bsc.h \
common_cs.h \
crc24.h \
@@ -46,11 +47,14 @@ noinst_HEADERS = \
handover_decision.h \
ipaccess.h \
iu.h \
+ iucs.h \
+ iucs_ranap.h \
meas_feed.h \
meas_rep.h \
mgcp.h \
mgcp_internal.h \
mgcp_transcode.h \
+ mgcpgw_client.h \
misdn.h \
mncc.h \
mncc_int.h \
diff --git a/openbsc/include/openbsc/common.h b/openbsc/include/openbsc/common.h
new file mode 100644
index 000000000..d91b3d39e
--- /dev/null
+++ b/openbsc/include/openbsc/common.h
@@ -0,0 +1,6 @@
+#pragma once
+
+enum nsap_addr_enc {
+ NSAP_ADDR_ENC_X213,
+ NSAP_ADDR_ENC_V4RAW,
+};
diff --git a/openbsc/include/openbsc/debug.h b/openbsc/include/openbsc/debug.h
index d8b6f4021..fa40e9c7c 100644
--- a/openbsc/include/openbsc/debug.h
+++ b/openbsc/include/openbsc/debug.h
@@ -38,6 +38,7 @@ enum {
DSUA,
DV42BIS,
DVLR,
+ DIUCS,
Debug_LastEntry,
};
diff --git a/openbsc/include/openbsc/gprs_gmm.h b/openbsc/include/openbsc/gprs_gmm.h
index d210a3547..c38e49f0d 100644
--- a/openbsc/include/openbsc/gprs_gmm.h
+++ b/openbsc/include/openbsc/gprs_gmm.h
@@ -30,6 +30,6 @@ int gprs_gmm_rx_resume(struct gprs_ra_id *raid, uint32_t tlli,
time_t gprs_max_time_to_idle(void);
-int iu_rab_act_ps(uint8_t rab_id, struct sgsn_pdp_ctx *pdp, bool use_x213_nsap);
+int iu_rab_act_ps(uint8_t rab_id, struct sgsn_pdp_ctx *pdp);
#endif /* _GPRS_GMM_H */
diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h
index 8c0dc0b11..971745980 100644
--- a/openbsc/include/openbsc/gsm_data.h
+++ b/openbsc/include/openbsc/gsm_data.h
@@ -13,8 +13,10 @@
#include <osmocom/crypt/auth.h>
+#include <openbsc/common.h>
#include <openbsc/rest_octets.h>
#include <openbsc/common_cs.h>
+#include <openbsc/mgcpgw_client.h>
/** annotations for msgb ownership */
#define __uses
@@ -102,6 +104,10 @@ enum ran_type {
RAN_UTRAN_IU, /* 3G / Iu-interface (IuCS or IuPS) */
};
+extern const struct value_string ran_type_names[];
+static inline const char *ran_type_name(enum ran_type val)
+{ return get_value_string(ran_type_names, val); }
+
struct gsm_classmark {
bool classmark1_set;
struct gsm48_classmark1 classmark1;
@@ -184,6 +190,10 @@ struct gsm_subscriber_connection {
struct {
struct ue_conn_ctx *ue_ctx;
int integrity_protection;
+ unsigned int mgcp_rtp_endpoint;
+ uint16_t mgcp_rtp_port_ue;
+ uint16_t mgcp_rtp_port_cn;
+ uint8_t rab_id;
} iu;
};
@@ -364,6 +374,11 @@ struct gsm_network {
struct mncc_sock_state *mncc_state;
mncc_recv_cb_t mncc_recv;
struct llist_head upqueue;
+ /*
+ * TODO: Move the trans_list into the subscriber connection and
+ * create a pending list for MT transactions. These exist before
+ * we have a subscriber connection.
+ */
struct llist_head trans_list;
struct bsc_api *bsc_api;
@@ -440,6 +455,15 @@ struct gsm_network {
/* Periodic location update default value */
uint8_t t3212;
+
+ struct {
+ struct mgcpgw_client_conf conf;
+ struct mgcpgw_client *client;
+ } mgcpgw;
+
+ struct {
+ enum nsap_addr_enc rab_assign_addr_enc;
+ } iu;
};
struct osmo_esme;
diff --git a/openbsc/include/openbsc/gsm_subscriber.h b/openbsc/include/openbsc/gsm_subscriber.h
index 4124e0624..d88e32aa7 100644
--- a/openbsc/include/openbsc/gsm_subscriber.h
+++ b/openbsc/include/openbsc/gsm_subscriber.h
@@ -41,6 +41,9 @@ enum gsm_subscriber_update_reason {
struct subscr_request {
struct llist_head entry;
+ /* human readable label to be able to log pending request kinds */
+ const char *label;
+
/* the callback data */
gsm_cbfn *cbfn;
void *param;
@@ -52,10 +55,12 @@ int subscr_update(struct vlr_subscr *vsub, int reason);
* Paging handling with authentication
*/
struct subscr_request *subscr_request_conn(struct vlr_subscr *vsub,
- int channel_type,
- gsm_cbfn *cbfn, void *param);
+ gsm_cbfn *cbfn, void *param,
+ const char *label);
void subscr_remove_request(struct subscr_request *req);
+int subscr_rx_paging_response(struct msgb *msg,
+ struct gsm_subscriber_connection *conn);
int subscr_paging_dispatch(unsigned int hooknum, unsigned int event,
struct msgb *msg, void *data, void *param);
diff --git a/openbsc/include/openbsc/iu.h b/openbsc/include/openbsc/iu.h
index f973ac1ba..0ef2f82f6 100644
--- a/openbsc/include/openbsc/iu.h
+++ b/openbsc/include/openbsc/iu.h
@@ -1,13 +1,25 @@
#pragma once
#include <stdbool.h>
+#include <stdint.h>
+
+#include <osmocom/core/linuxlist.h>
+#include <osmocom/gsm/gsm48.h>
+
+#include <openbsc/common.h>
struct sgsn_pdp_ctx;
struct msgb;
-struct gprs_ra_id;
+struct osmo_sccp_link;
+struct gsm_auth_tuple;
struct RANAP_RAB_SetupOrModifiedItemIEs_s;
struct RANAP_GlobalRNC_ID;
+struct RANAP_Cause;
+
+/* Debugging switches from asn1c and osmo-iuh */
+extern int asn_debug;
+extern int asn1_xer_print;
struct ue_conn_ctx {
struct llist_head list;
@@ -15,6 +27,7 @@ struct ue_conn_ctx {
uint32_t conn_id;
int integrity_active;
struct gprs_ra_id ra_id;
+ enum nsap_addr_enc rab_assign_addr_enc;
};
enum iu_event_type {
@@ -58,5 +71,8 @@ int iu_rab_act(struct ue_conn_ctx *ue_ctx, struct msgb *msg);
int iu_rab_deact(struct ue_conn_ctx *ue_ctx, uint8_t rab_id);
int iu_tx_sec_mode_cmd(struct ue_conn_ctx *uectx, struct gsm_auth_tuple *tp,
int send_ck, int new_key);
+int iu_tx_common_id(struct ue_conn_ctx *ue_ctx, const char *imsi);
+int iu_tx_release(struct ue_conn_ctx *ctx, const struct RANAP_Cause *cause);
-void iu_vty_init(int *asn_debug_p);
+void iu_vty_init(int iu_parent_node, enum nsap_addr_enc *rab_assign_addr_enc);
+int iu_vty_config_write(struct vty *vty, const char *indent);
diff --git a/openbsc/include/openbsc/iucs.h b/openbsc/include/openbsc/iucs.h
new file mode 100644
index 000000000..fb61a5cf1
--- /dev/null
+++ b/openbsc/include/openbsc/iucs.h
@@ -0,0 +1,7 @@
+#pragma once
+
+int gsm0408_rcvmsg_iucs(struct gsm_network *network, struct msgb *msg,
+ uint16_t *lac);
+
+struct gsm_subscriber_connection *subscr_conn_lookup_iu(struct gsm_network *network,
+ struct ue_conn_ctx *ue);
diff --git a/openbsc/include/openbsc/iucs_ranap.h b/openbsc/include/openbsc/iucs_ranap.h
new file mode 100644
index 000000000..748de23d7
--- /dev/null
+++ b/openbsc/include/openbsc/iucs_ranap.h
@@ -0,0 +1,7 @@
+#pragma once
+
+struct gsm_network;
+struct ue_conn_ctx;
+
+int iucs_rx_ranap_event(struct gsm_network *network,
+ struct ue_conn_ctx *ue_ctx, int type, void *data);
diff --git a/openbsc/include/openbsc/mgcp.h b/openbsc/include/openbsc/mgcp.h
index b2262bc8d..7cf83b27c 100644
--- a/openbsc/include/openbsc/mgcp.h
+++ b/openbsc/include/openbsc/mgcp.h
@@ -170,6 +170,21 @@ enum mgcp_role {
MGCP_BSC_NAT,
};
+enum mgcp_connection_mode {
+ MGCP_CONN_NONE = 0,
+ MGCP_CONN_RECV_ONLY = 1,
+ MGCP_CONN_SEND_ONLY = 2,
+ MGCP_CONN_RECV_SEND = MGCP_CONN_RECV_ONLY | MGCP_CONN_SEND_ONLY,
+ MGCP_CONN_LOOPBACK = 4 | MGCP_CONN_RECV_SEND,
+};
+
+extern const struct value_string mgcp_connection_mode_strs[];
+
+static inline const char *mgcp_cmode_name(enum mgcp_connection_mode mode)
+{
+ return get_value_string(mgcp_connection_mode_strs, mode);
+}
+
struct mgcp_config {
int source_port;
char *local_ip;
diff --git a/openbsc/include/openbsc/mgcp_internal.h b/openbsc/include/openbsc/mgcp_internal.h
index 7c89d1021..b58eb9b58 100644
--- a/openbsc/include/openbsc/mgcp_internal.h
+++ b/openbsc/include/openbsc/mgcp_internal.h
@@ -28,14 +28,6 @@
#define CI_UNUSED 0
-enum mgcp_connection_mode {
- MGCP_CONN_NONE = 0,
- MGCP_CONN_RECV_ONLY = 1,
- MGCP_CONN_SEND_ONLY = 2,
- MGCP_CONN_RECV_SEND = MGCP_CONN_RECV_ONLY | MGCP_CONN_SEND_ONLY,
- MGCP_CONN_LOOPBACK = 4 | MGCP_CONN_RECV_SEND,
-};
-
enum mgcp_trunk_type {
MGCP_TRUNK_VIRTUAL,
MGCP_TRUNK_E1,
@@ -340,3 +332,5 @@ static inline const char *mgcp_bts_src_addr(struct mgcp_endpoint *endp)
return endp->cfg->bts_ports.bind_addr;
return endp->cfg->source_addr;
}
+
+int mgcp_msg_terminate_nul(struct msgb *msg);
diff --git a/openbsc/include/openbsc/mgcpgw_client.h b/openbsc/include/openbsc/mgcpgw_client.h
new file mode 100644
index 000000000..b353db0a4
--- /dev/null
+++ b/openbsc/include/openbsc/mgcpgw_client.h
@@ -0,0 +1,87 @@
+#pragma once
+
+#include <stdint.h>
+
+#include <osmocom/core/linuxlist.h>
+
+enum mgcp_connection_mode;
+
+struct msgb;
+struct mgcpgw_client;
+struct vty;
+
+#define MGCPGW_CLIENT_LOCAL_ADDR_DEFAULT "0.0.0.0"
+#define MGCPGW_CLIENT_LOCAL_PORT_DEFAULT 0
+#define MGCPGW_CLIENT_REMOTE_ADDR_DEFAULT "127.0.0.1"
+#define MGCPGW_CLIENT_REMOTE_PORT_DEFAULT 2427
+
+#define MSGB_CB_MGCP_TRANS_ID 0
+
+typedef unsigned int mgcp_trans_id_t;
+
+struct mgcpgw_client_conf {
+ const char *local_addr;
+ int local_port;
+ const char *remote_addr;
+ int remote_port;
+};
+
+struct mgcp_response_head {
+ int response_code;
+ mgcp_trans_id_t trans_id;
+ const char *comment;
+};
+
+struct mgcp_response {
+ char *body;
+ struct mgcp_response_head head;
+ uint16_t audio_port;
+};
+
+/* Invoked when an MGCP response is received or sending failed. When the
+ * response is passed as NULL, this indicates failure during transmission. */
+typedef void (* mgcp_response_cb_t )(struct mgcp_response *response, void *priv);
+
+struct mgcp_response_pending {
+ struct llist_head entry;
+
+ mgcp_trans_id_t trans_id;
+ mgcp_response_cb_t response_cb;
+ void *priv;
+};
+
+
+void mgcpgw_client_conf_init(struct mgcpgw_client_conf *conf);
+
+struct mgcpgw_client *mgcpgw_client_init(void *ctx,
+ struct mgcpgw_client_conf *conf);
+int mgcpgw_client_connect(struct mgcpgw_client *mgcp);
+
+const char *mgcpgw_client_remote_addr_str(struct mgcpgw_client *mgcp);
+uint16_t mgcpgw_client_remote_port(struct mgcpgw_client *mgcp);
+uint32_t mgcpgw_client_remote_addr_n(struct mgcpgw_client *mgcp);
+
+unsigned int mgcpgw_client_next_endpoint(struct mgcpgw_client *client);
+
+int mgcp_response_parse_params(struct mgcp_response *r);
+
+int mgcpgw_client_tx(struct mgcpgw_client *mgcp, struct msgb *msg,
+ mgcp_response_cb_t response_cb, void *priv);
+
+struct msgb *mgcp_msg_crcx(struct mgcpgw_client *mgcp,
+ uint16_t rtp_endpoint, unsigned int call_id,
+ enum mgcp_connection_mode mode);
+
+struct msgb *mgcp_msg_mdcx(struct mgcpgw_client *mgcp,
+ uint16_t rtp_endpoint, const char *rtp_conn_addr,
+ uint16_t rtp_port, enum mgcp_connection_mode mode);
+
+void mgcpgw_client_vty_init(int node, struct mgcpgw_client_conf *conf);
+int mgcpgw_client_config_write(struct vty *vty, const char *indent);
+
+struct mgcp_response_pending * mgcpgw_client_pending_add(
+ struct mgcpgw_client *mgcp,
+ mgcp_trans_id_t trans_id,
+ mgcp_response_cb_t response_cb,
+ void *priv);
+int mgcpgw_client_rx(struct mgcpgw_client *mgcp, struct msgb *msg);
diff --git a/openbsc/include/openbsc/msc_ifaces.h b/openbsc/include/openbsc/msc_ifaces.h
index 83aad92a4..2965c72c5 100644
--- a/openbsc/include/openbsc/msc_ifaces.h
+++ b/openbsc/include/openbsc/msc_ifaces.h
@@ -22,7 +22,7 @@
* the compiler complains about an undefined reference to iu_tx(). If you,
* however, link against libiu as well as the osmo-iuh libs (etc.), iu_tx() is
* available. A unit test may instead simply implement a dummy iu_tx() function
- * and not link against osmo-iuh.
+ * and not link against osmo-iuh, see tests/libiudummy/.
*/
/* Each main linkage must implement this function (see comment above). */
@@ -35,6 +35,13 @@ extern int iu_tx(struct msgb *msg, uint8_t sapi);
* " */
extern int a_tx(struct msgb *msg);
+/* So far this is a dummy implemented in libmsc/a_iface.c. When A-interface
+ * gets implemented, it should be in a separate lib (like libiu), this function
+ * should move there, and the following comment should remain here: "
+ * Each main linkage must implement this function (see comment above).
+ * " */
+extern int a_page(const char *imsi, uint32_t tmsi, uint16_t lac);
+
int msc_tx_dtap(struct gsm_subscriber_connection *conn,
struct msgb *msg);
@@ -45,3 +52,7 @@ int msc_gsm48_tx_mm_serv_rej(struct gsm_subscriber_connection *conn,
/* TODO: specific to A interface, move this away */
int msc_gsm0808_tx_cipher_mode(struct gsm_subscriber_connection *conn, int cipher,
const uint8_t *key, int len, int include_imeisv);
+
+int msc_tx_common_id(struct gsm_subscriber_connection *conn);
+int msc_call_assignment(struct gsm_trans *trans);
+int msc_call_bridge(struct gsm_trans *trans1, struct gsm_trans *trans2);
diff --git a/openbsc/include/openbsc/osmo_msc.h b/openbsc/include/openbsc/osmo_msc.h
index 6096e0b3e..fa7ea293d 100644
--- a/openbsc/include/openbsc/osmo_msc.h
+++ b/openbsc/include/openbsc/osmo_msc.h
@@ -55,7 +55,6 @@ enum msc_compl_l3_rc {
MSC_CONN_REJECT = 1,
};
-
struct bsc_api *msc_bsc_api();
int msc_create_conn_fsm(struct gsm_subscriber_connection *conn, const char *id);
@@ -63,6 +62,14 @@ int msc_create_conn_fsm(struct gsm_subscriber_connection *conn, const char *id);
int msc_vlr_alloc(struct gsm_network *net);
int msc_vlr_start(struct gsm_network *net);
+int msc_compl_l3(struct gsm_subscriber_connection *conn,
+ struct msgb *msg, uint16_t chosen_channel);
+void msc_dtap(struct gsm_subscriber_connection *conn, uint8_t link_id,
+ struct msgb *msg);
+void msc_cipher_mode_compl(struct gsm_subscriber_connection *conn,
+ struct msgb *msg, uint8_t alg_id);
+void msc_rx_sec_mode_compl(struct gsm_subscriber_connection *conn);
+
void msc_subscr_conn_init(void);
bool msc_subscr_conn_is_accepted(struct gsm_subscriber_connection *conn);
void msc_subscr_conn_communicating(struct gsm_subscriber_connection *conn);
@@ -79,4 +86,6 @@ _msc_subscr_conn_get(struct gsm_subscriber_connection *conn,
void _msc_subscr_conn_put(struct gsm_subscriber_connection *conn,
const char *file, int line);
+void msc_stop_paging(struct vlr_subscr *vsub);
+
#endif
diff --git a/openbsc/include/openbsc/sgsn.h b/openbsc/include/openbsc/sgsn.h
index 1ed1583ed..57b2978ff 100644
--- a/openbsc/include/openbsc/sgsn.h
+++ b/openbsc/include/openbsc/sgsn.h
@@ -7,6 +7,7 @@
#include <osmocom/gprs/gprs_ns.h>
#include <openbsc/gprs_sgsn.h>
#include <openbsc/oap_client.h>
+#include <openbsc/common.h>
#include <ares.h>
@@ -109,6 +110,10 @@ struct sgsn_config {
int p1;
int p2;
} dcomp_v42bis;
+
+ struct {
+ enum nsap_addr_enc rab_assign_addr_enc;
+ } iu;
};
struct sgsn_instance {
diff --git a/openbsc/include/openbsc/transaction.h b/openbsc/include/openbsc/transaction.h
index 07ab7a7da..713d878f3 100644
--- a/openbsc/include/openbsc/transaction.h
+++ b/openbsc/include/openbsc/transaction.h
@@ -9,6 +9,14 @@
#include <osmocom/gsm/gsm0411_smc.h>
#include <osmocom/gsm/gsm0411_smr.h>
+enum bridge_state {
+ BRIDGE_STATE_NONE,
+ BRIDGE_STATE_LOOPBACK_PENDING,
+ BRIDGE_STATE_LOOPBACK_ESTABLISHED,
+ BRIDGE_STATE_BRIDGE_PENDING,
+ BRIDGE_STATE_BRIDGE_ESTABLISHED,
+};
+
/* One transaction */
struct gsm_trans {
/* Entry in list of all transactions */
@@ -57,6 +65,11 @@ struct gsm_trans {
struct gsm_sms *sms;
} sms;
};
+
+ struct {
+ struct gsm_trans *peer;
+ enum bridge_state state;
+ } bridge;
};
@@ -74,7 +87,7 @@ void trans_free(struct gsm_trans *trans);
int trans_assign_trans_id(struct gsm_network *net, struct vlr_subscr *vsub,
uint8_t protocol, uint8_t ti_flag);
-int trans_has_conn(const struct gsm_subscriber_connection *conn);
+struct gsm_trans *trans_has_conn(const struct gsm_subscriber_connection *conn);
void trans_conn_closed(struct gsm_subscriber_connection *conn);
#endif
diff --git a/openbsc/include/openbsc/vlr.h b/openbsc/include/openbsc/vlr.h
index d4ea4ff3b..380fdc6c0 100644
--- a/openbsc/include/openbsc/vlr.h
+++ b/openbsc/include/openbsc/vlr.h
@@ -155,7 +155,10 @@ struct vlr_subscr {
struct {
/* pending requests */
bool is_paging;
+ /* list of struct subscr_request */
struct llist_head requests;
+ uint8_t lac;
+ enum ran_type attached_via_ran;
} cs;
};
@@ -189,6 +192,10 @@ struct vlr_ops {
int (*set_ciph_mode)(void *msc_conn_ref, enum vlr_ciph ciph_mode,
bool retrieve_imeisv);
+ /* UTRAN: send Common Id (when auth+ciph are complete) */
+ int (*tx_common_id)(void *msc_conn_ref);
+
+
/* notify MSC/SGSN that the subscriber data in VLR has been updated */
void (*subscr_update)(struct vlr_subscr *vsub);
/* notify MSC/SGSN that the given subscriber has been associated
diff --git a/openbsc/include/openbsc/vty.h b/openbsc/include/openbsc/vty.h
index 1d5481599..967ec4073 100644
--- a/openbsc/include/openbsc/vty.h
+++ b/openbsc/include/openbsc/vty.h
@@ -48,6 +48,8 @@ struct log_info;
int bsc_vty_init(struct gsm_network *network);
int bsc_vty_init_extra(void);
+void msc_vty_init(struct gsm_network *msc_network);
+
struct gsm_network *gsmnet_from_vty(struct vty *vty);
#endif