summaryrefslogtreecommitdiffstats
path: root/src/host
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2017-11-29 14:35:40 +0800
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2017-12-03 12:58:52 +0000
commit04754e88899c58051ef1a0b0602261f033609dce (patch)
tree256875c1eb48681010194f3c744b0f1adafc1914 /src/host
parentd2cdf93b53ce3eb4714c3c97a5467e3dc455112b (diff)
mobile: Move starting/stopping a MS into a separate function
Move the check if within the mobile app there is no other active MS using the same L1 socket. This way we can call this function from the primitive code as well. Change-Id: Ib4aa5ff212fa6bead8f620abaecc6a0b51a99fec
Diffstat (limited to 'src/host')
-rw-r--r--src/host/layer23/include/osmocom/bb/mobile/app_mobile.h7
-rw-r--r--src/host/layer23/src/mobile/app_mobile.c47
-rw-r--r--src/host/layer23/src/mobile/vty_interface.c53
3 files changed, 70 insertions, 37 deletions
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 704c9726..7abfda1f 100644
--- a/src/host/layer23/include/osmocom/bb/mobile/app_mobile.h
+++ b/src/host/layer23/include/osmocom/bb/mobile/app_mobile.h
@@ -13,12 +13,15 @@ int l23_app_exit(void);
int l23_app_work(int *quit);
int mobile_delete(struct osmocom_ms *ms, int force);
struct osmocom_ms *mobile_new(char *name);
-int mobile_init(struct osmocom_ms *ms);
-int mobile_exit(struct osmocom_ms *ms, int force);
int mobile_work(struct osmocom_ms *ms);
+int mobile_start(struct osmocom_ms *ms, char **other_name);
+int mobile_stop(struct osmocom_ms *ms, int force);
void mobile_set_started(struct osmocom_ms *ms, bool state);
void mobile_set_shutdown(struct osmocom_ms *ms, int state);
+
+/* Internal code. Don't call directly */
+int mobile_exit(struct osmocom_ms *ms, int force);
#endif
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)
{
diff --git a/src/host/layer23/src/mobile/vty_interface.c b/src/host/layer23/src/mobile/vty_interface.c
index eafed6ea..81c20fe9 100644
--- a/src/host/layer23/src/mobile/vty_interface.c
+++ b/src/host/layer23/src/mobile/vty_interface.c
@@ -2696,35 +2696,25 @@ DEFUN(cfg_test_hplmn, cfg_test_hplmn_cmd, "hplmn-search (everywhere|foreign-coun
DEFUN(cfg_no_shutdown, cfg_ms_no_shutdown_cmd, "no shutdown",
NO_STR "Activate and run MS")
{
- struct osmocom_ms *ms = vty->index, *tmp;
+ struct osmocom_ms *ms = vty->index;
+ char *other_name = NULL;
int rc;
- if (ms->shutdown != MS_SHUTDOWN_COMPL)
- return CMD_SUCCESS;
-
- 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)) {
- vty_out(vty, "Cannot start MS '%s', because MS '%s' "
- "use the same layer2-socket.%sPlease shutdown "
- "MS '%s' first.%s", ms->name, tmp->name,
- VTY_NEWLINE, tmp->name, VTY_NEWLINE);
- return CMD_WARNING;
- }
- if (!strcmp(ms->settings.sap_socket_path,
- tmp->settings.sap_socket_path)) {
- vty_out(vty, "Cannot start MS '%s', because MS '%s' "
- "use the same sap-socket.%sPlease shutdown "
- "MS '%s' first.%s", ms->name, tmp->name,
- VTY_NEWLINE, tmp->name, VTY_NEWLINE);
- return CMD_WARNING;
- }
- }
-
- rc = mobile_init(ms);
- if (rc < 0) {
+ rc = mobile_start(ms, &other_name);
+ switch (rc) {
+ case -1:
+ vty_out(vty, "Cannot start MS '%s', because MS '%s' "
+ "use the same layer2-socket.%sPlease shutdown "
+ "MS '%s' first.%s", ms->name, other_name,
+ VTY_NEWLINE, other_name, VTY_NEWLINE);
+ return CMD_WARNING;
+ case -2:
+ vty_out(vty, "Cannot start MS '%s', because MS '%s' "
+ "use the same sap-socket.%sPlease shutdown "
+ "MS '%s' first.%s", ms->name, other_name,
+ VTY_NEWLINE, other_name, VTY_NEWLINE);
+ return CMD_WARNING;
+ case -3:
vty_out(vty, "Connection to layer 1 failed!%s",
VTY_NEWLINE);
return CMD_WARNING;
@@ -2737,10 +2727,7 @@ DEFUN(cfg_shutdown, cfg_ms_shutdown_cmd, "shutdown",
"Shut down and deactivate MS")
{
struct osmocom_ms *ms = vty->index;
-
- if (ms->shutdown == MS_SHUTDOWN_NONE)
- mobile_exit(ms, 0);
-
+ mobile_stop(ms, 0);
return CMD_SUCCESS;
}
@@ -2749,9 +2736,7 @@ DEFUN(cfg_shutdown_force, cfg_ms_shutdown_force_cmd, "shutdown force",
{
struct osmocom_ms *ms = vty->index;
- if (ms->shutdown <= MS_SHUTDOWN_IMSI_DETACH)
- mobile_exit(ms, 1);
-
+ mobile_stop(ms, 1);
return CMD_SUCCESS;
}