diff options
Diffstat (limited to 'src/host/layer23/src')
-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 |
4 files changed, 94 insertions, 32 deletions
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); |