summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVadim Yanitskiy <axilirator@gmail.com>2017-12-11 04:26:12 +0700
committerVadim Yanitskiy <axilirator@gmail.com>2018-10-03 18:43:07 +0700
commit22edbf3f846b13a404dd4e49c3ed25d757d3f527 (patch)
tree9510d452b7d07f9c5bc21a1f0e520eec0f214d8b
parente35308f50a23e3a676cc0cbcb25ac55c0bc98433 (diff)
mobile: add MNCC handler selection to settings
Since the mobile application is potentionally able to work with multiple MS instances, it's better to have a possibility to choose an MNCC (Call Control) handler per each MS separately. This change cleans up the code, removing a dedicated command-line option '-m' intended for enabling extarnal MNCC. Now it's possible to set an MNCC-handler for each MS via VTY interface and settings. The following MNCC-handlers are available: - mobile - build-in MNCC-handler (default); - socket - external MNCC-handler via UNIX-socket (e.g. LCR); - dummy - dummy handler without CC support. Change-Id: I2df91c7a79ba5c39bc6ceae900ef649129dd0346
-rw-r--r--doc/examples/mobile/default.cfg1
-rw-r--r--doc/examples/mobile/multi_ms.cfg2
-rw-r--r--src/host/layer23/include/osmocom/bb/mobile/app_mobile.h4
-rw-r--r--src/host/layer23/include/osmocom/bb/mobile/settings.h13
-rw-r--r--src/host/layer23/src/mobile/app_mobile.c42
-rw-r--r--src/host/layer23/src/mobile/main.c16
-rw-r--r--src/host/layer23/src/mobile/settings.c3
-rw-r--r--src/host/layer23/src/mobile/vty_interface.c65
8 files changed, 112 insertions, 34 deletions
diff --git a/doc/examples/mobile/default.cfg b/doc/examples/mobile/default.cfg
index c2d05941..367e4f06 100644
--- a/doc/examples/mobile/default.cfg
+++ b/doc/examples/mobile/default.cfg
@@ -15,6 +15,7 @@ ms 1
layer2-socket /tmp/osmocom_l2
sap-socket /tmp/osmocom_sap
mncc-socket /tmp/ms_mncc.1
+ mncc-handler mobile
sim reader
network-selection-mode auto
imei 000000000000000 0
diff --git a/doc/examples/mobile/multi_ms.cfg b/doc/examples/mobile/multi_ms.cfg
index d42cad0c..5037a1c5 100644
--- a/doc/examples/mobile/multi_ms.cfg
+++ b/doc/examples/mobile/multi_ms.cfg
@@ -15,6 +15,7 @@ ms one
layer2-socket /tmp/osmocom_l2.one
sap-socket /tmp/osmocom_sap.one
mncc-socket /tmp/ms_mncc.one
+ mncc-handler mobile
sim reader
network-selection-mode auto
imei 000000000000000 0
@@ -66,6 +67,7 @@ ms two
layer2-socket /tmp/osmocom_l2.two
sap-socket /tmp/osmocom_sap.two
mncc-socket /tmp/ms_mncc.two
+ mncc-handler mobile
sim reader
network-selection-mode auto
imei 000000000000000 0
diff --git a/src/host/layer23/include/osmocom/bb/mobile/app_mobile.h b/src/host/layer23/include/osmocom/bb/mobile/app_mobile.h
index c2ab3c88..e787797b 100644
--- a/src/host/layer23/include/osmocom/bb/mobile/app_mobile.h
+++ b/src/host/layer23/include/osmocom/bb/mobile/app_mobile.h
@@ -8,8 +8,8 @@ extern char *config_dir;
struct osmocom_ms;
struct vty;
-int l23_app_init(int (*mncc_recv)(struct osmocom_ms *ms, int, void *),
- const char *config_file, const char *vty_ip, uint16_t vty_port);
+int l23_app_init(const char *config_file,
+ const char *vty_ip, uint16_t vty_port);
int l23_app_exit(void);
int l23_app_work(int *quit);
int mobile_delete(struct osmocom_ms *ms, int force);
diff --git a/src/host/layer23/include/osmocom/bb/mobile/settings.h b/src/host/layer23/include/osmocom/bb/mobile/settings.h
index 30e88258..99bbbdae 100644
--- a/src/host/layer23/include/osmocom/bb/mobile/settings.h
+++ b/src/host/layer23/include/osmocom/bb/mobile/settings.h
@@ -3,11 +3,24 @@
#define MOB_C7_DEFLT_ANY_TIMEOUT 30
+/* How CC (Call Control) messages should be handled? */
+enum mncc_handler_t {
+ /* by built-in mobile MNCC */
+ MNCC_HANDLER_MOBILE,
+ /* by external MNCC application via UNIX-socket */
+ MNCC_HANDLER_SOCKET,
+ /* no call support */
+ MNCC_HANDLER_DUMMY,
+};
+
struct gsm_settings {
char layer2_socket_path[128];
char sap_socket_path[128];
char mncc_socket_path[128];
+ /* MNCC handler */
+ enum mncc_handler_t mncc_handler;
+
/* IMEI */
char imei[16];
char imeisv[17];
diff --git a/src/host/layer23/src/mobile/app_mobile.c b/src/host/layer23/src/mobile/app_mobile.c
index cbae4217..1e0e0157 100644
--- a/src/host/layer23/src/mobile/app_mobile.c
+++ b/src/host/layer23/src/mobile/app_mobile.c
@@ -54,8 +54,8 @@ extern struct llist_head ms_list;
extern int vty_reading;
int mncc_recv_mobile(struct osmocom_ms *ms, int msg_type, void *arg);
+int mncc_recv_socket(struct osmocom_ms *ms, int msg_type, void *arg);
int mncc_recv_dummy(struct osmocom_ms *ms, int msg_type, void *arg);
-int (*mncc_recv_app)(struct osmocom_ms *ms, int, void *);
static int quit;
/* handle ms instance */
@@ -241,6 +241,27 @@ static int mobile_init(struct osmocom_ms *ms)
"default IMEI.\n***\n");
}
+ /* Choose and init an MNCC handler */
+ switch (ms->settings.mncc_handler) {
+ case MNCC_HANDLER_SOCKET:
+ LOGP(DMOB, LOGL_INFO, "Using external MNCC-handler (socket '%s') "
+ "for MS '%s'\n", ms->settings.mncc_socket_path, ms->name);
+ ms->mncc_entity.mncc_recv = mncc_recv_socket;
+ ms->mncc_entity.sock_state = mncc_sock_init(ms,
+ ms->settings.mncc_socket_path);
+ break;
+ case MNCC_HANDLER_MOBILE:
+ LOGP(DMOB, LOGL_INFO, "Using the built-in MNCC-handler "
+ "for MS '%s'\n", ms->name);
+ ms->mncc_entity.mncc_recv = mncc_recv_mobile;
+ break;
+ case MNCC_HANDLER_DUMMY:
+ default:
+ LOGP(DMOB, LOGL_INFO, "Using dummy MNCC-handler (no call support) "
+ "for MS '%s'\n", ms->name);
+ ms->mncc_entity.mncc_recv = mncc_recv_dummy;
+ }
+
l1ctl_tx_reset_req(ms, L1CTL_RES_T_FULL);
LOGP(DMOB, LOGL_NOTICE, "Mobile '%s' initialized, please start phone now!\n", ms->name);
return 0;
@@ -323,16 +344,6 @@ struct osmocom_ms *mobile_new(char *name)
mobile_set_shutdown(ms, MS_SHUTDOWN_COMPL);
- if (mncc_recv_app) {
- ms->mncc_entity.mncc_recv = mncc_recv_app;
- ms->mncc_entity.sock_state = mncc_sock_init(ms,
- ms->settings.mncc_socket_path);
- } else if (ms->settings.ch_cap == GSM_CAP_SDCCH)
- ms->mncc_entity.mncc_recv = mncc_recv_dummy;
- else
- ms->mncc_entity.mncc_recv = mncc_recv_mobile;
-
-
return ms;
}
@@ -343,7 +354,8 @@ int mobile_delete(struct osmocom_ms *ms, int force)
ms->deleting = true;
- if (mncc_recv_app) {
+ /* Close MNCC socket if used */
+ if (ms->settings.mncc_handler == MNCC_HANDLER_SOCKET) {
mncc_sock_exit(ms->mncc_entity.sock_state);
ms->mncc_entity.sock_state = NULL;
}
@@ -437,14 +449,12 @@ static struct vty_app_info vty_info = {
};
/* global init */
-int l23_app_init(int (*mncc_recv)(struct osmocom_ms *ms, int, void *),
- const char *config_file, const char *vty_ip, uint16_t vty_port)
+int l23_app_init(const char *config_file,
+ const char *vty_ip, uint16_t vty_port)
{
struct telnet_connection dummy_conn;
int rc = 0;
- mncc_recv_app = mncc_recv;
-
osmo_gps_init();
vty_info.tall_ctx = l23_ctx;
diff --git a/src/host/layer23/src/mobile/main.c b/src/host/layer23/src/mobile/main.c
index 115ac419..aaaa682b 100644
--- a/src/host/layer23/src/mobile/main.c
+++ b/src/host/layer23/src/mobile/main.c
@@ -54,11 +54,8 @@ struct gsmtap_inst *gsmtap_inst = NULL;
static char *vty_ip = "127.0.0.1";
unsigned short vty_port = 4247;
char *config_dir = NULL;
-int use_mncc_sock = 0;
int daemonize = 0;
-int mncc_recv_socket(struct osmocom_ms *ms, int msg_type, void *arg);
-
int mobile_delete(struct osmocom_ms *ms, int force);
int mobile_signal_cb(unsigned int subsys, unsigned int signal,
void *handler_data, void *signal_data);
@@ -95,8 +92,6 @@ static void print_help()
debug_default);
printf(" -D --daemonize Run as daemon\n");
printf(" -c --config-file filename The config file to use.\n");
- printf(" -m --mncc-sock Disable built-in MNCC handler and "
- "offer socket\n");
}
static void handle_options(int argc, char **argv)
@@ -111,11 +106,10 @@ static void handle_options(int argc, char **argv)
{"debug", 1, 0, 'd'},
{"daemonize", 0, 0, 'D'},
{"config-file", 1, 0, 'c'},
- {"mncc-sock", 0, 0, 'm'},
{0, 0, 0, 0},
};
- c = getopt_long(argc, argv, "hi:u:c:v:d:Dm",
+ c = getopt_long(argc, argv, "hi:u:c:v:d:D",
long_options, &option_index);
if (c == -1)
break;
@@ -144,9 +138,6 @@ static void handle_options(int argc, char **argv)
case 'D':
daemonize = 1;
break;
- case 'm':
- use_mncc_sock = 1;
- break;
default:
break;
}
@@ -247,10 +238,7 @@ int main(int argc, char **argv)
config_dir = talloc_strdup(l23_ctx, config_file);
config_dir = dirname(config_dir);
- if (use_mncc_sock)
- rc = l23_app_init(mncc_recv_socket, config_file, vty_ip, vty_port);
- else
- rc = l23_app_init(NULL, config_file, vty_ip, vty_port);
+ rc = l23_app_init(config_file, vty_ip, vty_port);
if (rc)
exit(rc);
diff --git a/src/host/layer23/src/mobile/settings.c b/src/host/layer23/src/mobile/settings.c
index 16d005cf..86b3f1d4 100644
--- a/src/host/layer23/src/mobile/settings.c
+++ b/src/host/layer23/src/mobile/settings.c
@@ -46,6 +46,9 @@ int gsm_settings_init(struct osmocom_ms *ms)
snprintf(set->mncc_socket_path, sizeof(set->mncc_socket_path) - 1,
mncc_socket_path, ms->name);
+ /* Built-in MNCC handler */
+ set->mncc_handler = MNCC_HANDLER_MOBILE;
+
/* network search */
set->plmn_mode = PLMN_MODE_AUTO;
diff --git a/src/host/layer23/src/mobile/vty_interface.c b/src/host/layer23/src/mobile/vty_interface.c
index d8c0144e..cb03ae89 100644
--- a/src/host/layer23/src/mobile/vty_interface.c
+++ b/src/host/layer23/src/mobile/vty_interface.c
@@ -1326,6 +1326,17 @@ static void config_write_ms(struct vty *vty, struct osmocom_ms *ms)
VTY_NEWLINE);
vty_out(vty, " sap-socket %s%s", set->sap_socket_path, VTY_NEWLINE);
vty_out(vty, " mncc-socket %s%s", set->mncc_socket_path, VTY_NEWLINE);
+ switch (set->mncc_handler) {
+ case MNCC_HANDLER_MOBILE:
+ vty_out(vty, " mncc-handler mobile%s", VTY_NEWLINE);
+ break;
+ case MNCC_HANDLER_SOCKET:
+ vty_out(vty, " mncc-handler socket%s", VTY_NEWLINE);
+ break;
+ case MNCC_HANDLER_DUMMY:
+ default:
+ vty_out(vty, " no mncc-handler%s", VTY_NEWLINE);
+ }
switch(set->sim_type) {
case GSM_SIM_TYPE_NONE:
vty_out(vty, " sim none%s", VTY_NEWLINE);
@@ -1602,7 +1613,7 @@ DEFUN(cfg_ms_sap, cfg_ms_sap_cmd, "sap-socket PATH",
return CMD_SUCCESS;
}
-DEFUN(cfg_ms_mncc, cfg_ms_mncc_cmd, "mncc-socket PATH",
+DEFUN(cfg_ms_mncc_sock, cfg_ms_mncc_sock_cmd, "mncc-socket PATH",
"Define socket path for MNCC interface\n"
"Unix socket, default '/tmp/ms_mncc.<ms_name>'")
{
@@ -1616,6 +1627,54 @@ DEFUN(cfg_ms_mncc, cfg_ms_mncc_cmd, "mncc-socket PATH",
return CMD_SUCCESS;
}
+DEFUN(cfg_ms_mncc_handler, cfg_ms_mncc_handler_cmd,
+ "mncc-handler (mobile|socket)",
+ "Set MNCC (Call Control) handler\n"
+ "Built-in mobile MNCC (default)\n"
+ "External MNCC application via UNIX-socket (e.g. LCR)")
+{
+ struct osmocom_ms *ms = vty->index;
+ struct gsm_settings *set = &ms->settings;
+
+ switch (argv[0][0]) {
+ case 'm':
+ if (set->ch_cap != GSM_CAP_SDCCH) {
+ set->mncc_handler = MNCC_HANDLER_MOBILE;
+ } else {
+ vty_out(vty, "TCH support isn't enabled, "
+ "see 'channel-capability' option%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ break;
+ case 's':
+ set->mncc_handler = MNCC_HANDLER_SOCKET;
+ break;
+ default:
+ vty_out(vty, "Given mncc-handler invalid%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ /* Restart required */
+ vty_restart_if_started(vty, ms);
+
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_ms_no_mncc_handler, cfg_ms_no_mncc_handler_cmd,
+ "no mncc-handler", NO_STR "Disable Call Control")
+{
+ struct osmocom_ms *ms = vty->index;
+ struct gsm_settings *set = &ms->settings;
+
+ /* Dummy handler */
+ set->mncc_handler = MNCC_HANDLER_DUMMY;
+
+ /* Restart required */
+ vty_restart_if_started(vty, ms);
+
+ return CMD_SUCCESS;
+}
+
DEFUN(cfg_ms_sim, cfg_ms_sim_cmd, "sim (none|reader|test|sap)",
"Set SIM card to attach when powering on\nAttach no SIM\n"
"Attach SIM from reader\nAttach bulit in test SIM\n"
@@ -2904,7 +2963,9 @@ int ms_vty_init(void)
install_element(MS_NODE, &cfg_ms_show_this_cmd);
install_element(MS_NODE, &cfg_ms_layer2_cmd);
install_element(MS_NODE, &cfg_ms_sap_cmd);
- install_element(MS_NODE, &cfg_ms_mncc_cmd);
+ install_element(MS_NODE, &cfg_ms_mncc_sock_cmd);
+ install_element(MS_NODE, &cfg_ms_mncc_handler_cmd);
+ install_element(MS_NODE, &cfg_ms_no_mncc_handler_cmd);
install_element(MS_NODE, &cfg_ms_sim_cmd);
install_element(MS_NODE, &cfg_ms_mode_cmd);
install_element(MS_NODE, &cfg_ms_imei_cmd);