summaryrefslogtreecommitdiffstats
path: root/src/host/layer23/src/mobile/app_mobile.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/host/layer23/src/mobile/app_mobile.c')
-rw-r--r--src/host/layer23/src/mobile/app_mobile.c47
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)
{