diff options
author | Vadim Yanitskiy <axilirator@gmail.com> | 2017-12-11 04:26:12 +0700 |
---|---|---|
committer | Vadim Yanitskiy <axilirator@gmail.com> | 2018-10-03 18:43:07 +0700 |
commit | 22edbf3f846b13a404dd4e49c3ed25d757d3f527 (patch) | |
tree | 9510d452b7d07f9c5bc21a1f0e520eec0f214d8b | |
parent | e35308f50a23e3a676cc0cbcb25ac55c0bc98433 (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.cfg | 1 | ||||
-rw-r--r-- | doc/examples/mobile/multi_ms.cfg | 2 | ||||
-rw-r--r-- | src/host/layer23/include/osmocom/bb/mobile/app_mobile.h | 4 | ||||
-rw-r--r-- | src/host/layer23/include/osmocom/bb/mobile/settings.h | 13 | ||||
-rw-r--r-- | src/host/layer23/src/mobile/app_mobile.c | 42 | ||||
-rw-r--r-- | src/host/layer23/src/mobile/main.c | 16 | ||||
-rw-r--r-- | src/host/layer23/src/mobile/settings.c | 3 | ||||
-rw-r--r-- | src/host/layer23/src/mobile/vty_interface.c | 65 |
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); |