diff options
Diffstat (limited to 'src/host/layer23/src/mobile/app_mobile.c')
-rw-r--r-- | src/host/layer23/src/mobile/app_mobile.c | 47 |
1 files changed, 46 insertions, 1 deletions
diff --git a/src/host/layer23/src/mobile/app_mobile.c b/src/host/layer23/src/mobile/app_mobile.c index c5c84e62..b2900ad5 100644 --- a/src/host/layer23/src/mobile/app_mobile.c +++ b/src/host/layer23/src/mobile/app_mobile.c @@ -181,7 +181,7 @@ int mobile_exit(struct osmocom_ms *ms, int force) } /* power-on ms instance */ -int mobile_init(struct osmocom_ms *ms) +static int mobile_init(struct osmocom_ms *ms) { int rc; @@ -245,6 +245,51 @@ int mobile_init(struct osmocom_ms *ms) return 0; } +int mobile_start(struct osmocom_ms *ms, char **other_name) +{ + struct osmocom_ms *tmp; + int rc; + + if (ms->shutdown != MS_SHUTDOWN_COMPL) + return 0; + + llist_for_each_entry(tmp, &ms_list, entity) { + if (tmp->shutdown == MS_SHUTDOWN_COMPL) + continue; + if (!strcmp(ms->settings.layer2_socket_path, + tmp->settings.layer2_socket_path)) { + LOGP(DMOB, LOGL_ERROR, "Cannot start MS '%s', because MS '%s' " + "use the same layer2-socket.\nPlease shutdown " + "MS '%s' first.\n", ms->name, tmp->name, tmp->name); + *other_name = tmp->name; + return -1; + } + if (!strcmp(ms->settings.sap_socket_path, + tmp->settings.sap_socket_path)) { + LOGP(DMOB, LOGL_ERROR, "Cannot start MS '%s', because MS '%s' " + "use the same sap-socket.\nPlease shutdown " + "MS '%s' first.\n", ms->name, tmp->name, tmp->name); + *other_name = tmp->name; + return -2; + } + } + + rc = mobile_init(ms); + if (rc < 0) + return -3; + return 0; +} + +int mobile_stop(struct osmocom_ms *ms, int force) +{ + if (force && ms->shutdown <= MS_SHUTDOWN_IMSI_DETACH) + return mobile_exit(ms, 1); + if (!force && ms->shutdown == MS_SHUTDOWN_NONE) + return mobile_exit(ms, 0); + return 0; +} + + /* create ms instance */ struct osmocom_ms *mobile_new(char *name) { |